2011-09-02 37 views
6

Tôi có dịch vụ WCF hai chiều đang hoạt động với WSDualHttpBinding. Vấn đề của tôi là tìm ra cách để lưu trữ kênh gọi lại với một id duy nhất. Dịch vụ này được dự định sẽ hoạt động trong thời gian dài. Tôi có thể chỉ cần lấy giá trị trả về OperationContext.Current.GetCallbackChannel() khi phương thức "Đăng ký" được gọi và lưu trữ trong danh sách hoặc từ điển không? Nó có được đảm bảo là hợp lệ cho đến khi kết nối còn sống không?Nhận dạng khách hàng trong dịch vụ WCF

Trả lời

5

Cách dễ nhất là để khách hàng gửi giá trị chính trong phương thức đăng ký dịch vụ của bạn. Sau đó, bạn có thể lưu kênh Gọi lại trong từ điển. Từ điển này có lẽ sẽ cần phải là một biến tĩnh hoặc lớp singleton có tuổi thọ lớn hơn tuổi thọ của lớp dịch vụ vì hầu hết các lớp dịch vụ đều có thời gian PerCall và được xử lý sau khi cuộc gọi dịch vụ hoàn tất. Hãy coi chừng vấn đề luồng!

Kênh gọi lại có thể bị lỗi bất kỳ lúc nào trên máy khách hoặc phía dịch vụ. Dịch vụ phải xử lý khả năng kênh bị lỗi và xóa kênh bị lỗi khỏi từ điển. WSDuallHttpBinding là một ràng buộc "không quốc tịch" nên mọi lỗi trong máy khách sẽ không được phát hiện ở phía dịch vụ cho đến khi phía dịch vụ cố gắng gọi chúng. NetTcpBinding sẽ nâng cao sự kiện ChannelFaulted nếu máy khách bị rơi vào trạng thái bị lỗi. Vì lý do đó tôi muốn giới thiệu NetTcpBinding nếu nó phù hợp với yêu cầu của bạn.

public bool Subscribe(string id) { 
     ICallback callback = OperationContext.Current.GetCallbackChannel(); 
     if (!_activeCallbackChannels.Contains(id)) { 
      _activeCallbackChannels.Add(id, callback); 
      return true; 
     } 
     else { 
      return false; 
     } 

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