2010-07-03 34 views
7

OperationContext.Current.GetCallbackChannel thực sự làm gì? Làm thế nào để nó xác định mỗi và mọi khách hàng?"OperationContext.Current.GetCallbackChannel" thực sự làm gì?

Tôi đang gặp sự cố trong dịch vụ WCF của mình. Nếu có nhiều hơn hai người dùng được kết nối với dịch vụ, tất cả các "Thay đổi thú vị" mà tôi đang gửi từ dịch vụ tới khách hàng sẽ chuyển sang người dùng đã tham gia thứ hai.

Đối với ex, Nếu A, B, C, D tham gia các dịch vụ nếu tôi gửi những thay đổi C và D thông qua callback nó sẽ B.

Bất kỳ ý tưởng?

Chi tiết:

Chủ đầu tư: ASP.NET ứng dụng web

Binding: netTCPBinding

Update1

Okie, tôi đã tìm thấy nguyên nhân của vấn đề này. Tôi đã lưu trữ máy khách asp.net trong IIS. Ví dụ: URL của ứng dụng khách là http://url1. Nếu tôi mở nhiều phiên bản của trang trong máy khác nhau và tham gia dịch vụ, kênh gọi lại luôn trỏ đến phiên bản đầu tiên của trang (tôi mở trang web từ các máy khác nhau). Nhưng nếu tôi lưu trữ các khách hàng asp.net theo các trang web khác nhau trong IIS các kênh gọi lại là duy nhất. Bất kỳ suy nghĩ về điều đó?

+3

Tôi đã nói với bạn rằng những gì bạn đang làm sẽ không hoạt động. Nhận xét này không dành cho bạn - nó dành cho những người đọc nó sau này. Không, ** bao giờ ** cố gắng gọi lại hoặc tham chiếu, một trang ASP.NET sau khi yêu cầu hoàn tất. Trang sẽ không tồn tại. –

+1

Cảm ơn bạn đã bình luận của bạn John. Tôi chỉ tìm hiểu thêm về cách gọi lại hoạt động. Bất cứ điều gì bạn nói đã ** làm cho cảm giác hoàn hảo **. Tôi không cố gắng nữa trong cùng một hướng. – NLV

Trả lời

6

Khi dịch vụ nhận được cuộc gọi, OperationContext.Current.GetCallbackChannel trả về một kênh cho người gọi đó. Nó không trả về một kênh phát sóng tới tất cả các khách hàng.

Từ câu hỏi của bạn, có thể bạn chỉ lưu trữ cuộc gọi lại đã được truy lục trong cuộc gọi cuối cùng. Bạn thực sự phải lưu trữ một danh sách, chứa từng cá thể gọi lại duy nhất đã được truy lục. Mỗi khi một phương thức được gọi, bạn thêm cá thể gọi lại vào danh sách này. Khi bạn muốn phát sóng, bạn phải lặp qua từng mục trong danh sách và thực hiện cuộc gọi cần thiết.

Nếu dịch vụ của bạn sử dụng chế độ mẫu Singleton, đối tượng triển khai có thể lưu trữ danh sách các cá thể gọi lại dưới dạng thành viên dữ liệu. Nếu sevice của bạn sử dụng chế độ cá thể Client hoặc SingleCall, thì bạn có thể có một đối tượng chung chứa danh sách các cá thể gọi lại.

+0

Có. Đây là cách tôi chính xác làm điều đó. Tôi đang sử dụng [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] cho dịch vụ của tôi. Nhưng tôi vẫn nhận được cùng một vấn đề. Bây giờ tôi đã tạo một từ điển để lưu trữ các kênh gọi lại. Vẫn còn tất cả các kênh gọi lại cho người dùng đã tham gia sau khi người dùng thứ hai (từ người dùng thứ ba) luôn trỏ đến người dùng thứ hai. Tôi đang theo dõi bài viết tuyệt vời này - http: // www.codeproject.com/KB/WCF/WCFWPFChat.aspx của Sacha Barber. – NLV

+0

Có phải "OperationContext.Current.GetCallbackChannel" được dựa trên đối tượng proxy tôi sử dụng để gọi dịch vụ từ máy khách không? – NLV

+0

Đã cập nhật bài đăng của tôi. Xin vui lòng kiểm tra xem nó. – NLV

1

Bạn phải định cấu hình dịch vụ của mình để tạo chuỗi được phân tách cho mỗi phiên. Hãy xem http://msdn.microsoft.com/en-us/library/cc681240.aspx

+0

Vâng, tôi biết điều đó. Tôi đã cấu hình chế độ phiên và bối cảnh cá thể và các cấu hình khác cần thiết để tạo hợp đồng song công với tính năng gọi lại. Tất cả câu hỏi của tôi là làm thế nào nó thực sự tạo ra một kênh với khách hàng? – NLV

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