【问题标题】:Access the object which hosts the service访问托管服务的对象
【发布时间】: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

我的问题是:

  1. 我可以使用多个值 InstanceContextMode 一些方法(其中 我认为不可能)?

  2. ServiceImpl 还有其他方法吗 获取引用的对象 托管它的对象?

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

谢谢。

【问题讨论】:

  • 在您的应用程序中实现单例服务是否有特殊要求?单例 WCF 服务很少有好的用例。如果这是一个问题,这种实现几乎会扼杀服务的可扩展性。
  • 是的,serviceImpl 对象需要引用承载服务的 ServiceHoster 对象。你能指导我看看你提到的用例吗?谢谢。
  • 下面的链接有在 WCF 中有效使用单例的最佳总结。如果您没有执行已接受答案中列出的任何操作,则应考虑使用诸如 wsDualHttpBinding 之类的绑定或任何其他支持双工通信的绑定。链接:stackoverflow.com/questions/1756487/…

标签: c# wcf hosting duplex-channel


【解决方案1】:

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

OperationContext.Current.Host

【讨论】:

  • 我不需要访问 ServiceHost 对象。相反,我试图访问创建和托管 ServiceHost 的对象。尝试访问 ServiceImpl 对象中的 ServiceHoster 对象
【解决方案2】:

首先,我认为您不需要对 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-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多