0

我正在使用 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;
    }
}

在我想要的客户端回调方法上

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
}

这可能吗?在服务端使用自己的合同生成新课程的最佳实践是什么?还是我只需将所有内容捆绑到一个庞大的 MyService 类中并自己处理所有内容?

4

1 回答 1

1

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

  • 客户端通过其代理调用服务器的服务
  • 服务器通过接收到的回调通道调用客户端的服务

服务器的服务实例上下文只在服务器上有意义。目前尚不清楚您要实现什么(非常复杂的架构除外)。

  • 如果您想在客户端上共享上下文,您可以尝试传递用于您创建的第一个代理的实例上下文 - 我不确定它是否会起作用,但您可以尝试一下
  • 如果你想在多个代理之间共享服务实例上下文,你必须开发你自己的IInstanceContextProvider,也许还有你自己的IInstanceProvider(取决于你想要实现的目标),将它们包装在行为中并将它们添加到服务中。这将使会话处理的整个复杂性和正确的实例释放在您的控制之下(它显然有其优点和缺点)。

但真的需要吗?当我查看您的代码时,我发现一项服务和一个代理就足够了。此外,您的JoinRoom操作根本不需要使用回调,它可以只是请求响应方法。

于 2011-09-15T07:25:10.067 回答