WCF - 推荐客户端回调?

标签 wcf callback wcf-callbacks

我有一个 WCF 服务,它公开两个操作 - IncrementList() 和 GetList()。客户端 B 连接到服务,调用 GetList() 并向用户显示。客户端 A 可以通过调用 IncrementList() 来更新此列表。
我希望客户端 B 在调用 IncrementList() 时收到通知,以便它可以再次调用 GetList() 以显示更新的数据。

您能否概述一下您将如何实现这一点?回调?复式?发布者/订阅者?
WCF 4.0 中有什么新功能可以帮助解决这种情况吗?

Service diagram

谢谢!

最佳答案

您应该预先决定的是,如果您想要在增量(大量)时将整个列表推送到每个客户端,还是仅将更新的项目推送到每个客户端。下面的代码用于推送整个列表,但很容易修改它只是为了推送更新的对象(推荐)。
在应用程序启动时,客户端 B 应调用 Register_client,然后调用 GetList。随后列表增加时会回调通知(客户端需要隐含此接口(interface))
调用 GetList 需要双工 channel 和 SessionMode.Required

你的服务器应该实现:

[ServiceContract(SessionMode = SessionMode.Required
                 CallbackContract = typeof(IMyCallback))]
    public interface IMyServer {

    [OperationContract]
    void Register_client();

    [OperationContract(IsOneWay = true)]
    void IncrementList();

    [OperationContract]
    ListObject[] GetList();
}  

[DataContract]
public class ListObject {
    [DataMember]...
}

你的客户应该暗示:

public interface IMyCallback {
    [OperationContract(IsOneWay = true)]
    void PushList(ListObject[] list);
}

注册客户端只需要存储客户端回调接口(interface),以便在列表递增时使用,例如:

public override void Register_client() {
    // Store callback interfaces for all connected clients:
    IMyCallback callback = OperationContext.Current.GetCallbackChannel<IGatewayServerCallback>();
    if (clients.Contains(callback) == false)
    clients.Add(callback);
    Trace.WriteLine(string.Format("Client connection established ({0})", clients.Count));
}

地点:

private List<IMyCallback> clients = new List<IMyCallback>();

IncrementList 的实现应该执行回调以将新列表(或者更好的是添加到列表中的新对象)推送到客户端 - 类似于:

for (int i = 0; i < clients.Count; i++) {
    if (((ICommunicationObject)clients[i]).State == CommunicationState.Opened) {
    try {
        clients[i].PushList(list);
    }
    catch (Exception e) {
        clients.RemoveAt(i--);
        Trace.WriteLine(e);
        Trace.WriteLine(string.Format("Removing client {0} (exception).", i + 1));
    }
}

回调实现(客户端)看起来像:

public class MyCallback : IMyCallback {
public void PushList(ListObject[] list) {
    // Were client side - update list code here...
}

这个回调实现可能需要引用某个保存列表数据的对象 - 可能会传递给构造函数(未显示)。

当您实例化代理对象时,您需要将回调实例传递给代理构造函数 - 类似于:

MyServerClient client_proxy = new MyServerClient(new InstanceContext(my_callback, binding_str)

关于WCF - 推荐客户端回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7992025/

相关文章:

c# - 如何强制 WCF 线程中未处理的异常使进程崩溃?

asp.net - 使用像 asmx 服务一样的 aspx 页面

javascript - SimpleModal:窗口调整大小会导致滚动条和模式内容的重绘

javascript - jQuery 事件回调速度 : Anonymous vs. 命名函数

wcf - 如何从服务器向 WCF 中的所有客户端发送通知消息(可以说是广播)?

asp.net-mvc - 同一子域下的azure wcf和mvc

wcf - 将 Ninject 与 WebServiceHost 一起使用的正确方法是什么

c# - Blazor 事件回调问题父/子组件 "does not have a property matching the name ' OnClickCallback'"

负载均衡服务器中的WCF回调

c# - WCF回调-同步执行