访问承载服务的对象

时间:2011-05-02 13:36:27

标签: c# wcf hosting duplex-channel

我正在使用带有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

我的问题是:

  1. 我可以使用多个值吗? InstanceContextMode有些怎样(哪个 我认为不可能)?

  2. ServiceImpl还有其他方法 反对获取参考的对象 托管它的对象?

  3. 我能做些什么吗? 不同的解决问题?

  4. 感谢。

2 个答案:

答案 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