2012-02-15 20 views
6

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 
+0

Tại sao bạn cần sử dụng basiHttpBinding? wsHttpBinding sẽ cung cấp cho bạn điều này. –

+0

@JustinDearing: Khách hàng truy cập dịch vụ không hỗ trợ wsHttpBinding. – GaussZ

+0

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ó? –

Trả lời

1

Không có câu trả lời dễ câu hỏi này. Bạn đang yêu cầu một hành vi được thực hiện trong WS- * nhưng được thực hiện bằng cách sử dụng SOAP cơ bản. Tôi nghĩ rằng lựa chọn duy nhất của bạn nếu bạn thực sự không thể chuyển sang wsHttpBinding hoặc sử dụng duplex như đề xuất bởi @Trevor Pilley là cố gắng bắt chước hành vi của WS-Transaction trong giao thức tùy chỉnh của riêng bạn dựa trên SOAP cơ bản.

Bạn sẽ có thể nhận được một số đơn giản hóa so với đặc điểm kỹ thuật WS-giao dịch đầy đủ vì

  • Bạn sẽ có thể chỉ cần hỗ trợ giao dịch trên một dịch vụ duy nhất - bạn sẽ không được thực hiện một giao dịch phân tán trên nhiều độc lập dịch vụ
  • Bạn sẽ không cần phải hỗ trợ cả hai ngắn một giao dịch (WS-AtomicTransaction) cũng như các giao dịch dài chạy (WS-BusinessActivity) probaby giao dịch nguyên tử sẽ làm
  • Bạn sẽ không cần phải hỗ trợ bất kỳ loại mô hình mở rộng (WS-Coordination)
  • Bạn sẽ không cần triển khai mô hình khám phá/siêu dữ liệu mô tả giao thức (ví dụ: như WSDL) vì bạn sẽ mã hóa hành vi giao thức trực tiếp vào máy khách và dịch vụ.

Tuy nhiên, bạn có thể cần các thành phần của cả WS-Coordination và WS-AtomicTransaction.Đây không phải là một nhiệm vụ đơn giản bởi bất kỳ phương tiện nào và sẽ dễ dàng bỏ lỡ điều gì đó tinh vi có thể gây ra hoặc không xảy ra hoặc hủy bỏ hiệu suất dịch vụ của bạn bằng cách có khóa thời gian dài trên cơ sở dữ liệu của bạn khách hàng bị lỗi.

Như tôi đã nói, đây là một hành vi phức tạp và nếu bạn không thể sử dụng các giao thức chuẩn hóa sẵn sàng, không có câu trả lời đơn giản.

+0

Tôi đã thêm làm rõ thêm cho câu hỏi. Tôi chỉ muốn khôi phục giao dịch nếu việc truyền tải thư trả lời từ máy khách đến máy chủ bị lỗi. Máy khách không bao giờ phát huy tác dụng hoặc chỉ cho đến khi máy khách không nhận được các gói TCP/IP. – GaussZ

+1

Nhưng làm cách nào để dịch vụ biết liệu khách hàng đã nhận được tin nhắn chưa? Chẳng phải nó sẽ phải thông báo cho dịch vụ trong một cuộc gọi thứ hai, ví dụ, với phương thức Commit đi qua trong một ID giao dịch mà nó nhận được từ phản hồi cho cuộc gọi dịch vụ ban đầu ... –

+0

Tôi thấy những gì bạn đang nghĩ với TCP/IP ACK nhưng bạn đang sử dụng HTTP và tôi không nghĩ rằng TCP/IP cơ bản được tiếp xúc bởi WCF. và trên thực tế, HTTP không nhất thiết phải dựa trên TCP/IP. Bất kỳ phương tiện giao thông đáng tin cậy nào cũng sẽ làm. Điều này có thể ngụ ý rằng việc triển khai tuân thủ nghiêm ngặt tiêu chuẩn sẽ không phơi bày giao thức dây bên dưới. –

Các vấn đề liên quan