Đây là tình huống của tôi. Tôi đã viết một dịch vụ WCF gọi vào một trong các cơ sở mã của nhà cung cấp của chúng tôi để thực hiện các hoạt động, chẳng hạn như Đăng nhập, Đăng xuất, vv Yêu cầu của hoạt động này là chúng ta có một chuỗi nền để nhận các sự kiện là kết quả của hành động đó. Ví dụ: Hành động đăng nhập được gửi trên luồng chính. Sau đó, một số sự kiện được nhận lại từ dịch vụ của nhà cung cấp do đăng nhập. Có thể có 1, 2 hoặc nhiều sự kiện đã nhận được. Chủ đề nền chạy trên bộ hẹn giờ, nhận các sự kiện này và kích hoạt sự kiện trong dịch vụ wcf để thông báo rằng một sự kiện mới đã đến.Dịch vụ WCF với các cuộc gọi lại đến từ chủ đề nền?
Tôi đã triển khai dịch vụ WCF ở chế độ Hai mặt và được lên kế hoạch sử dụng gọi lại để thông báo cho UI biết các sự kiện đã đến. Đây là câu hỏi của tôi: Làm cách nào để gửi các sự kiện mới từ chuỗi nền tới chuỗi đang thực hiện dịch vụ?
Ngay bây giờ, khi tôi gọi OperationContext.Current.GetCallbackChannel<IMyCallback>()
, OperationContext là rỗng. Có một mô hình chuẩn để giải quyết vấn đề này không?
Tôi đang sử dụng PerSession làm SessionMode của mình trên ServiceContract.
CẬP NHẬT: Tôi nghĩ tôi muốn làm cho kịch bản chính xác của mình rõ ràng hơn bằng cách chứng minh cách tôi nhận sự kiện từ mã nhà cung cấp. Thư viện của tôi nhận được mỗi sự kiện, xác định sự kiện là gì và kích hoạt một sự kiện cho sự kiện cụ thể đó.
Tôi có một dự án khác là thư viện lớp học đặc biệt để kết nối với dịch vụ của nhà cung cấp. Tôi sẽ đăng toàn bộ thi hành dịch vụ để cung cấp cho một bức tranh rõ ràng hơn:
[ServiceBehavior(
InstanceContextMode = InstanceContextMode.PerSession
)]
public class VendorServer:IVendorServer
{
private IVendorService _vendorService; // This is the reference to my class library
public VendorServer()
{
_vendorServer = new VendorServer();
_vendorServer.AgentManager.AgentLoggedIn += AgentManager_AgentLoggedIn; // This is the eventhandler for the event which arrives from a background thread
}
public void Login(string userName, string password, string stationId)
{
_vendorService.Login(userName, password, stationId); // This is a direct call from the main thread to the vendor service to log in
}
private void AgentManager_AgentLoggedIn(object sender, EventArgs e)
{
var agentEvent = new AgentEvent
{
AgentEventType = AgentEventType.Login,
EventArgs = e
};
}
}
Đối tượng AgentEvent chứa callback là một trong những thuộc tính của nó, và tôi đã suy nghĩ tôi muốn thực hiện các cuộc gọi lại như thế này:
agentEvent.Callback = OperationContext.Current.GetCallbackChannel<ICallback>();
các AgentEvent là một đối tượng quy định tại các dịch vụ:
[DataContract]
public class AgentEvent
{
[DataMember]
public EventArgs EventArgs { get; set; }
[DataMember]
public AgentEventType AgentEventType { get; set; }
[DataMember]
public DateTime TimeStamp{ get; set; }
[DataMember]
public IVendorCallback Callback { get; set; }
}
IVendorCallback trông như thế này:
public interface IVendorCallback
{
[OperationContract(IsOneWay = true)]
void SendEvent(AgentEvent agentEvent);
}
Gọi lại được thực hiện trên máy khách và sử dụng EventArgs porperty của AgentEvent để điền dữ liệu trên giao diện người dùng. Làm cách nào để truyền thể hiện OperationContext.Current từ luồng chính vào luồng nền?
Không có đủ thông tin trong bản cập nhật của bạn để thực sự hiểu những gì đang xảy ra. Mã này nằm ở đâu? Làm thế nào để bạn thực hiện "đăng nhập"? Có một số loại phương pháp không đồng bộ không? Điều gì đang xảy ra với 'AgentEvent' đó (nó thực sự được sử dụng ở đâu)? Và loại 'agentEvent.Callback' là gì và giá trị của nó được sử dụng như thế nào/khi nào? – Aaronaught
Tôi đã thêm một ví dụ hoàn chỉnh hơn về những gì tôi đang cố gắng làm. Các sự kiện tôi nhận được bị sa thải khỏi thư viện mà tôi đang sử dụng trong dịch vụ, đó là lý do tại sao tôi phải đăng ký với họ. –