2

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

服务主机代码:

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 回答 2

1

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

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

如果您在 Google 上搜索 IInstanceProvider,您会找到有关它是如何完成的示例 - 如果您使用 IoC 容器,您很可能会找到以这种方式工作的 WCF 集成。

于 2011-05-02T18:27:25.323 回答
1

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

OperationContext.Current.Host
于 2011-05-02T18:37:39.803 回答