访问承载服务的对象



我使用WCF 4与c#。我使用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 set为PerSession

我的问题是:

  1. 我可以使用多个值InstanceContextMode some how (which .我认为是不可能的)?

  2. 还有其他的方法吗对象来获取引用承载它的物体?

  3. 有什么我可以做的吗用不同的方式来解决问题?

谢谢。

首先,我认为你不需要对你的InstanceContextMode做任何事情。有关如何保存已连接客户端列表的更多信息,请参阅MSDN/WCF论坛主题:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/463dd4a2-f9db-4773-b373-7dd470e65f90/

如果你仍然想这样做,我建议你实现一个实例提供程序(通过实现IInstanceProvider实例并将其插入到ServiceHost中,并使用你选择的行为)

如果你在谷歌上搜索IInstanceProvider,你会发现它是如何完成的例子——如果你使用IoC容器,你很可能会发现它的WCF集成是这样工作的。

获取当前请求的serviceHost引用,如下所示:

OperationContext.Current.Host

相关内容

  • 没有找到相关文章

最新更新