Triệu chứng
Sau khi bạn cài đặt ngày 2018 .NET Framework bảo mật và bản chất lượng áp dụng cho .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 và 4.7.2 trên Windows 7 gói dịch vụ 1 (SP1), Windows Server 2008 R2 SP1 hoặc Windows Server 2008 SP2, bạn thấy lỗi trong một .NET Khung ứng dụng đáp ứng các tiêu chí sau:
-
Ứng dụng sử dụng các phiên bản của System.Transaction.TransactionScope dòng giao dịch được kích hoạt bằng cách đi qua TransactionScopeAsyncFlowOption.Enabled để xây dựng.
-
Ứng dụng làm cho một hoặc nhiều cuộc gọi từ xa trong khi một trong các phạm vi giao dịch được kích hoạt. Trong trường hợp này, một cuộc gọi từ xa là bất kỳ cuộc gọi đi qua một proxy minh bạch trước khi đối tượng máy chủ. Ví dụ về các cuộc gọi từ xa bao gồm các cuộc gọi lên các ứng dụng và gọi qua kênh remoting, chẳng hạn như các kênh khách hàng được xác định trong không gian tên System.Runtime.Remoting.Channels .
-
Cuộc gọi từ xa, System.Transactions.Transaction.Current trả lại giá trị không thay vì giá trị đã được trả lại trước khi cuộc gọi từ xa.
Giải pháp
Để khắc phục sự cố này, hãy thử những phương pháp sau:
-
Đối với mỗi phạm vi giao dịch cho phép lưu lượng giao dịch, thay đổi các ứng dụng để đảm bảo rằng các cuộc gọi từ xa không xảy ra ở bất cứ đâu trong mã khi phạm vi giao dịch được kích hoạt. Khi bạn xác định một phạm vi giao dịch có bất kỳ cuộc gọi từ xa, xem xét các hướng dẫn sau:
-
Cuộc gọi tới phương pháp tĩnh không bao giờ là một cuộc gọi từ xa.
-
Một cuộc gọi là phương pháp thể hiện một đối tượng mục tiêu, gọi là từ xa chỉ khi các đối tượng mục tiêu là một proxy minh bạch.
-
Một cuộc gọi để xây dựng một, gọi là từ xa chỉ khi các đối tượng được xây dựng một proxy minh bạch.
Lưu ýBạn luôn có thể sử dụng phương pháp System.Runtime.Remoting.RemotingServices.IsTransparentProxy để kiểm tra xem đối tượng trong suốt proxy.
-
-
Vô hiệu hoá giao dịch dòng bằng cách loại bỏ các tham số xây dựng TransactionScopeAsyncFlowOption.Enabled .
Cảnh báo
Giải pháp này có thể gây ra lỗi khác nếu thực hiện bất kỳ hoạt động "chờ" khi phạm vi giao dịch được kích hoạt.
-
Thuộc tính Transaction.Current không được tự động trên cuộc gọi từ xa. Nó phải được chuyển như một tham số. Nếu cuộc gọi từ xa qua giao dịch như một tham số và không gọi lại cho khách hàng trong cuộc gọi từ xa, bạn có thể tạo cuộc gọi từ xa trong một đối tượng TransactionScope mới sử dụng TransactionScopeOptions.Suppress Tuỳ chọn. Trong này ngăn chặn phạm vi giao dịch, nhà Transaction.Current có giá trị không.
Trạng thái
Chúng tôi biết vấn đề này và hiện đang làm việc trên một giải pháp.