我正在使用带有C#的WCF 4。我正在使用 InstanceContextMode 设置为单个。实现我的契约的类的实例是使用构造函数创建的,该构造函数接受托管服务的对象的引用。在创建和托管服务主机时传递服务对象。
服务实施代码:
[ServiceBehavior(UseSynchronizationContext = false,
InstanceContextMode = InstanceContextMode.Single)]
public class ServiceImpl : IMyContract
{
private ServiceHoster _sh;
ServiceImpl(ServiceHoster sh)
{
_sh = sh;
}
public string Call(string input)
{
... //Do some processing on the input string
return _sh.ProcessCall(string input);
}
}
ServiceHoster代码:
public class ServiceHoster
{
private ServiceImpl ns;
ServiceHoster()
{
...
Start();
}
private void Start()
{
//Host Service
ns = new ServiceImpl(this);
//Instantiate NetTCP service
_tcpServiceHost = new ServiceHost(ns, new Uri("net.tcp://localhost:8089"));
_tcpServiceHost.Open();
}
private void Stop()
{
if(ns != null && ns.State == CommunicationState.Opened)
ns.Close();
}
public string ProcessCall(string input)
{
...
return result;
}
}
我现在面临的问题是,我们需要客户端和服务器之间的双工通信。对于双工连接,我们需要将 InstanceContextMode 设置为 PerSession 。
我的问题是:
我可以使用多个值吗? InstanceContextMode有些怎样(哪个 我认为不可能)?
ServiceImpl还有其他方法 反对获取参考的对象 托管它的对象?
我能做些什么吗? 不同的解决问题?
感谢。
答案 0 :(得分:1)
首先,我认为你不需要对InstanceContextMode做任何事情。有关如何保留已连接客户端列表的详细信息,请参阅此MSDN / WCF论坛主题:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/463dd4a2-f9db-4773-b373-7dd470e65f90/
如果您仍然希望这样做,我建议您实现一个实例提供程序(通过实现IInstanceProvider实例并使用您选择的行为将其插入ServiceHost。)
如果您使用Google for IInstanceProvider,您将找到有关如何使用的示例 - 如果您使用IoC容器,您很可能会找到以这种方式工作的WCF集成。
答案 1 :(得分:0)
获取对当前请求的serviceHost的引用,如下所示:
OperationContext.Current.Host