อาการ
หลังจากที่คุณติดตั้งแบบ 2018 กรกฎาคม.NET Framework ปลอดภัยและเปลี่นคุณภาพที่นำไปใช้กับ.NET Framework 4.6, 4.6.1 การ 4.6.2 การ 4.7, 4.7.1 และ 4.7.2 บน Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 หรือ Windows Server 2008 SP2 คุณสังเกตเห็นข้อผิดพลาดในการ.NET โปรแกรมประยุกต์กรอบงานที่ตรงกับเกณฑ์ต่อไปนี้:
-
แอพลิเคชันใช้อินสแตนซ์ของคลาSystem.Transaction.TransactionScopeที่ธุรกรรมขั้นตอนการเปิดใช้งาน โดยการส่งผ่านTransactionScopeAsyncFlowOption.Enabledไปยังตัวสร้างปลั๊กอิน
-
แอพลิเคชันทำให้การเรียกระยะไกลอย่าง น้อยหนึ่งในขณะที่ค่าใดค่าหนึ่งในขอบข่ายธุรกรรมเหล่านี้จะเปิดใช้งาน ในกรณีนี้ การเรียกระยะไกลคือการ โทรใด ๆ ที่ส่งผ่านทางพร็อกซีโปร่งใสก่อนที่จะถึงวัตถุเซิร์ฟเวอร์ ตัวอย่างของการเรียกระยะไกลรวมเรียกโดเมนโปรแกรมประยุกต์อื่นและการเรียกผ่านช่องทางระยะไกล เช่นไคลเอนต์สถานีที่กำหนดไว้ใน namespaces System.Runtime.Remoting.Channels
-
หลังจากการเรียกระยะไกลSystem.Transactions.Transaction.Currentส่งกลับค่า null แทนที่เป็นค่าที่ส่งคืนมาก่อนที่จะเรียกเลขหมายระยะไกล
การแก้ปัญหา
เมื่อต้องการหลีกเลี่ยงปัญหานี้ ลองทำตามวิธีการต่อไปนี้:
-
สำหรับขอบเขตแต่ละธุรกรรมที่เปิดใช้งานธุรกรรมกระแสอยู่ เปลี่ยนแปลงแอพลิเคชันเพื่อให้แน่ใจว่า มีการเรียกระยะไกลเกิดขึ้นที่ใดก็ได้ในโค้ดที่ทำงานในขณะที่ขอบเขตธุรกรรมที่ใช้งานอยู่ เมื่อคุณตรวจสอบว่า ขอบเขตธุรกรรมประกอบด้วยเรียกใด ๆ ระยะไกลให้พิจารณาคำแนะนำต่อไปนี้:
-
การเรียกเมธอดแบบสแตติกไม่ใช่การเรียกระยะไกล
-
สำหรับการเรียกวิธีการอินสแตนซ์บนวัตถุเป้าหมาย การเรียกไม่ไกลวัตถุเป้าหมายคือ พร็อกซีโปร่งใส
-
สำหรับการเรียกไปยังตัวสร้างปลั๊กอิน การเรียกไม่ไกลวัตถุที่สร้างเป็นพร็อกซีโปร่งใส
หมายเหตุ คุณสามารถใช้เมธอดSystem.Runtime.Remoting.RemotingServices.IsTransparentProxyเพื่อตรวจสอบว่า วัตถุ พร็อกซีโปร่งใสเสมอกัน
-
-
ปิดใช้งานขั้นตอนการธุรกรรม โดยเอาอาร์กิวเมนต์คอนสตรัคเตอร์TransactionScopeAsyncFlowOption.Enabled
คำเตือน
วิธีแก้ปัญหานี้มีแนวโน้มที่จะทำให้เกิดข้อผิดพลาดอื่น ๆ ดำเนินการดำเนินการใด ๆ "รอ" ในขณะที่ขอบเขตธุรกรรมที่ใช้งานอยู่
-
คุณสมบัติTransaction.Currentจะไม่โดยอัตโนมัติทำให้เป็นอนุกรมเพื่อการเรียกระยะไกล จะต้องถูกส่งผ่านเป็นพารามิเตอร์ ถ้าการเรียกระยะไกลผ่านธุรกรรมเป็นพารามิเตอร์ และทำการติดต่อกลับไปยังไคลเอนต์ในระหว่างการเรียกระยะไกล คุณสามารถสร้างการเรียกระยะไกลภายในขอบข่ายธุรกรรมวัตถุใหม่ที่ใช้TransactionScopeOptions.Suppress ตัวเลือก ซึ่งอยู่ภายในขอบข่ายธุรกรรมที่ระงับ คุณสมบัติTransaction.Currentมีค่า null
สถานะ
เราตระหนักถึงปัญหานี้ และกำลังทำงานกับวิธีแก้ไขปัญหา