Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 如何回调客户端并使用实例上下文公开新通道_Wcf_Nettcpbinding_Wcf Callbacks - Fatal编程技术网

Wcf 如何回调客户端并使用实例上下文公开新通道

Wcf 如何回调客户端并使用实例上下文公开新通道,wcf,nettcpbinding,wcf-callbacks,Wcf,Nettcpbinding,Wcf Callbacks,我正在使用netTcpBinding提供WCF服务,它有一个主大厅,有多个聊天室,客户可以进入。Lobby类将ILobby实现为服务契约 当一个客户想要进入一个房间时,我想回调该客户,为他刚刚进入的房间显示一个包含InstanceContext的新频道,但经过多次搜索,我怀疑这是可能的 例如,在服务端,我可能有 class Lobby : ILobby { Dictionary<string, Chatroom> rooms; public void JoinRoo

我正在使用netTcpBinding提供WCF服务,它有一个主大厅,有多个聊天室,客户可以进入。Lobby类将ILobby实现为服务契约

当一个客户想要进入一个房间时,我想回调该客户,为他刚刚进入的房间显示一个包含InstanceContext的新频道,但经过多次搜索,我怀疑这是可能的

例如,在服务端,我可能有

class Lobby : ILobby
{
    Dictionary<string, Chatroom> rooms;

    public void JoinRoom(string roomname)
    {
        if (rooms[roomname].TryEnter()) {}
    }
}

class ChatRoom : IChatRoom
{
    public bool TryEnter(string username)
    {
        ILobbyCallback callback =
            OperationContext.Current.GetCallbackChannel<ILobbyCallback>();
        // How do I do this next bit?
        callback.JoinedRoom(pass some instance context here);
        return true;
    }
}

这可能吗?在服务端生成具有自己契约的新类的最佳实践是什么?还是我必须将所有内容捆绑到一个大型MyService类中,然后自己处理所有内容?

您不能将实例上下文作为参数传递给任何操作契约。这没有意义,因为上下文具有局部范围。它被称为“实例上下文”=它是当前服务实例的上下文。在双工方案中,客户端和服务器都有自己的服务:

  • 客户端通过其代理调用服务器的服务
  • 服务器通过收到的回调通道调用客户端的服务
服务器的服务实例上下文仅在服务器上有意义。不清楚您想要实现什么(非常复杂的体系结构除外)

  • 如果您想在客户端上共享上下文,您可以尝试传递用于您创建的第一个代理的实例上下文-我不确定它是否有效,但您可以尝试
  • 如果您想在多个代理之间共享服务实例上下文,您必须开发自己的
    IInstanceContextProvider
    ,也可能开发自己的
    IInstanceProvider
    (取决于您想要实现什么),将它们包装在行为中并添加到服务中。这将使会话处理和正确的实例释放的整个复杂性在您的控制之下(这显然有其优点和缺点)
但真的需要吗?当我查看您的代码时,我发现一个服务和一个代理就足够了。另外,您的
JoinRoom
操作根本不需要使用回调,它可以只是请求-响应方法

public void JoinedRoom(InstanceContext for the room on the service side)
{
    // Create a new WCF proxy using above InstanceContext
    // Create a WPF UI for the new room passing the proxy so it can communicate
    // with the room class directly without going via the root service
}