【发布时间】:2011-08-17 00:01:20
【问题描述】:
我正在使用带有 C# 的 WCF 4。我正在使用 InstanceContextMode 设置为 Single。实现我的合同的类的实例是使用构造函数创建的,该构造函数接受承载服务的对象的引用。在创建和托管服务主机时传递服务对象。
服务实现代码:
[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 还有其他方法吗 获取引用的对象 托管它的对象?
有什么我可以做的吗 以不同的方式解决问题?
谢谢。
【问题讨论】:
-
在您的应用程序中实现单例服务是否有特殊要求?单例 WCF 服务很少有好的用例。如果这是一个问题,这种实现几乎会扼杀服务的可扩展性。
-
是的,serviceImpl 对象需要引用承载服务的 ServiceHoster 对象。你能指导我看看你提到的用例吗?谢谢。
-
下面的链接有在 WCF 中有效使用单例的最佳总结。如果您没有执行已接受答案中列出的任何操作,则应考虑使用诸如 wsDualHttpBinding 之类的绑定或任何其他支持双工通信的绑定。链接:stackoverflow.com/questions/1756487/…
标签: c# wcf hosting duplex-channel