Tôi đang hiển thị dịch vụ WCF thông qua basicHttpBinding
thực hiện một số thao tác trên cơ sở dữ liệu.WCF basicHttpBinding: Rollback khi trả lời ứng dụng không thành công
Tôi muốn đảm bảo rằng nếu khách hàng không nhận được trả lời, các hoạt động cơ sở dữ liệu được khôi phục (mà không có bất kỳ luồng giao dịch nào thông qua WCF). Ví dụ: khách hàng gọi phương thức "DoX" thực hiện trên máy chủ nhưng trước khi nó kết thúc, máy khách gặp sự cố. Các hoạt động cơ sở dữ liệu sau đó sẽ được khôi phục ngay sau khi trả lời không thể gửi cho khách hàng.
Có cách nào để làm điều đó không? Liệu thuộc tính [OperationBehavior(TransactionScopeRequired=true)]
có hoạt động như vậy không? Có khả năng xử lý lỗi giao tiếp ở phía máy chủ không?
Cập nhật 1: Dường [OperationBehavior(TransactionScopeRequired=true)]
cam kết giao dịch trước khi phản hồi được gửi đến khách hàng và do đó không thể được sử dụng để thực hiện một rollback nếu khách hàng không nhận được trả lời.
Cập nhật 2: Để nêu rõ ràng một lần nữa, tôi không có nhu cầu giao dịch tương tác trong bất kỳ cách nào với phía khách hàng. Khách hàng không nên biết về giao dịch, có khả năng hủy bỏ hoặc cam kết giao dịch đó, cũng như không nên có bất kỳ giao dịch nào chảy qua ràng buộc. Các chỉ nơi tôi muốn giao dịch để rollback là ở phía máy chủ nếu kênh vận chuyển không thể gửi tin nhắn cho khách hàng nhận. Với trường hợp của TCP/IP, thông tin này sẽ có sẵn cho máy chủ. (Không ACK của gói tin TCP gửi lại cho khách hàng)
Vì vậy, một dòng chảy thực hiện giả thuyết trên phía máy chủ (chú ý việc thiếu phía khách hàng) nên:
Receive client request
Start transaction
Execute all logic inside the service operation
Send reply back to client
if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission
Tại sao bạn cần sử dụng basiHttpBinding? wsHttpBinding sẽ cung cấp cho bạn điều này. –
@JustinDearing: Khách hàng truy cập dịch vụ không hỗ trợ wsHttpBinding. – GaussZ
trong tò mò nền tảng khách hàng là gì? Hiện http://wso2.com có một khách hàng xà phòng cho nó? –