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