C#中的单例WCF服务

时间:2014-09-19 12:03:42

标签: wcf singleton

我正在用C#开发一个应用程序。我创建了ServiceHost应用程序,它将托管wcf服务。 客户端将通过传递一些参数来调用ServiceHost.exe。 我已经尝试了以下方式。

static class ServiceHost
   {
      private static ITest channel = null;

     static void Main(string[] args)
        {
            if (String.Compare(args[0], "dooperation", true) == 0) 
               {
                    NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
                    binding.ReceiveTimeout = TimeSpan.MaxValue;
                    EndpointAddress ep = new EndpointAddress(address);

                   channel = ChannelFactory<ITest>.CreateChannel(binding, ep);

                   channel.DoOpertion1();
                   channel.Close() // close service

                   // Make sure the application runs!
                   Application.Run();
                   GC.KeepAlive(m_singleInstance);
               }
              else if (String.Compare(args[0], "stop", true) == 0) 
               {
                    NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);

                    binding.ReceiveTimeout = TimeSpan.MaxValue;
                    EndpointAddress ep = new EndpointAddress(address);

                   channel = ChannelFactory<ITest>.CreateChannel(binding, ep);

                   channel.DoOpertion2();

                   channel.Close() // close service
            // Exit Appli
                    Application.Exit(); 
               }
        }
   }

所以我在这里创建沟通渠道,调用方法和关闭渠道。 但是创建namepipe,然后通信通道和服务通道消耗更多时间,所以我想优化调用,以便每当客户端调用ServiceHost.exe时它将创建单个WCF服务通信通道实例。

有没有办法创建单一的频道实例? 如果我们继续打开namepine /沟通渠道会有任何副作用。

1 个答案:

答案 0 :(得分:0)

重用WCF通道是反模式,通道不是线程安全的,您必须处理故障状态。通道的创建并不耗时,工厂的创建也是如此。所以你应该重用你的ChannelFactory。

MSDN Middle-Tier Client Applications