Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问承载服务的对象_C#_Wcf_Hosting_Duplex Channel - Fatal编程技术网

C# 访问承载服务的对象

C# 访问承载服务的对象,c#,wcf,hosting,duplex-channel,C#,Wcf,Hosting,Duplex Channel,我将WCF 4与C#一起使用。我正在使用InstanceContextMode设置为单一模式。实现my contract的类的实例是使用构造函数创建的,该构造函数接受承载服务的对象的引用。在创建和托管服务主机时传递服务对象 服务实施代码: [ServiceBehavior(UseSynchronizationContext = false, InstanceContextMode = InstanceContextMode.Single)] public class Servi

我将WCF 4与C#一起使用。我正在使用InstanceContextMode设置为单一模式。实现my contract的类的实例是使用构造函数创建的,该构造函数接受承载服务的对象的引用。在创建和托管服务主机时传递服务对象

服务实施代码:

[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

我的问题是:

  • 我可以使用多个值来表示吗 InstanceContextMode一些方法(哪一种 我认为这是不可能的)

  • ServiceImpl还有其他方法吗 对象以获取引用 托管它的对象的名称

  • 有什么我能做的吗 用不同的方法来解决问题


  • 谢谢。

    首先,我认为您不需要对InstanceContext模式做任何更改。有关如何保存已连接客户端列表的更多信息,请参阅此MSDN/WCF论坛线程:

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


    如果您在Google上搜索IInstanceProvider,您会发现如何实现的示例-如果您使用IoC容器,您很可能会发现它的WCF集成是这样工作的。

    获取当前请求的serviceHost参考,如下所示:

    OperationContext.Current.Host
    

    在应用程序中实现单例服务是否有特殊要求?单例WCF服务很少有好的用例。如果这是一个问题的话,这个实现几乎会扼杀服务的可伸缩性。是的,serviceImpl对象需要引用承载服务的ServiceHoster对象。你能告诉我你提到的用例吗?谢谢。下面的链接提供了在WCF中有效使用singleton的最佳摘要。如果您没有执行公认答案中列出的任何操作,那么应该考虑使用诸如wsDualHttpBinding之类的绑定或任何其他支持双工通信的绑定。链接:我不需要访问ServiceHost对象。相反,我尝试访问创建和托管ServiceHost的对象。尝试访问ServiceImpl对象中的ServiceHoster对象我会尝试一下,如果可能的话,稍后会发布代码。谢谢你的建议。