无法主持&在Windows 7上的Windows服务中使用netNamedPipeBinding启动WCF服务

时间:2016-07-28 12:59:50

标签: wcf netnamedpipebinding

我正在使用在4.5 .Net Framework上使用C#构建的两个应用程序

  1. WPF桌面应用程序
  2. Windows服务
  3. 希望他们使用IPC(进程间通信)方法相互通信,因为他们需要经常根据条件共享一些数据/对象状态。

    使用netNamedPipeBinding的WCF似乎是一个非常灵活的解决方案。我已经创建了一个WCF服务器和客户端&测试在Console Application中成功托管。

    由于此解决方案有效,我希望WCF服务器托管在Windows服务中(这是我最终的要求)。

    我可以成功托管应用程序(猜测因为我没有看到任何可见的错误)但我无法连接任何客户端。我已经使用了WcfTestClient.exe工具(Visual Studio默认工具)以及尝试从控制台应用程序连接,它们似乎都没有工作,因为我一直在收到错误 - 无法从net.pipe获取元数据:// localhost / TestWCFService / mex。详情见下文。

    我已使用管理员权限注册了Windows服务并运行了控制台应用测试客户端&具有相同用户的WcfTestClient.exe。

    当然,我错过了一些东西,感谢你帮忙解决问题。

    这是代码,我在Windows服务中用于托管WCF netNamedPipeBinding服务:

    protected override void OnStart(string[] args)
        {
            try
            {
                if (wcfServiceHostObj != null)
                    wcfServiceHostObj.Close();
    
                wcfServiceHostObj = new ServiceHost(typeof(TestWCFService));
                wcfServiceHostObj.Open();
                EventLog.WriteEntry(ServiceName, "WCF Host - Started Successfully ", EventLogEntryType.Information);
    
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry(ServiceName, "exception raised " + ex.InnerException, EventLogEntryType.Error);
                throw;
            }
    
        }
    

    错误:无法从net.pipe获取元数据:// localhost / TestWCFService / mex如果这是您有权访问的Windows(R)Communication Foundation服务,请检查您是否已在指定地址启用元数据发布。有关启用元数据发布的帮助,请参阅http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata上的MSDN文档.Exchange错误URI:net.pipe:// localhost / TestWCFService / mex元数据包含无法解析的引用:'net.pipe:// localhost / TestWCFService / MEX”。在net.pipe:// localhost / TestWCFService / mex上没有可以接受该消息的端点监听。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。在本地计算机上找不到管道端点'net.pipe:// localhost / TestWCFService / mex'。

    这是我的WCF服务器配置设置:

    <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="TestWCFServiceNetPipeBehavior">
                        <serviceDebug includeExceptionDetailInFaults="true" />
                        <serviceMetadata />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
    
            <services>
                <service behaviorConfiguration="TestWCFServiceNetPipeBehavior"
                    name="WCFHostTest.WCFService.TestWCFService">
    
                  <endpoint address="net.pipe://localhost/TestWCFService" binding="netNamedPipeBinding"  bindingConfiguration=""
                      name="TestWCFServiceNetPipeEndPoint" contract="WCFHostTest.WCFService.ITestWCFService" >
    
                  </endpoint>
    
                    <endpoint address="net.pipe://localhost/TestWCFService/mex" binding="mexNamedPipeBinding" bindingConfiguration=""
                        name="TestWCFServiceMexPipeEndpoint" contract="IMetadataExchange" />
                    <host>
                        <!--<baseAddresses>
                            <add baseAddress="net.pipe://localhost/TestWCFService" />
                        </baseAddresses>-->
                    </host>
                </service>
            </services>
        </system.serviceModel>
    

    对于客户端(在控制台应用程序中),我使用内联。 这里代码为

    private static void testClient()
        {
            try
            {
                string address = "net.pipe://localhost/TestWCFService";
                 NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
                EndpointAddress ep = new EndpointAddress(address);
    
                ITestWCFService channel = ChannelFactory<ITestWCFService>.CreateChannel(binding, ep);
    
                using (channel as IDisposable)
                {
                    channel.SendMessage("First Message");
                }
    
                Console.ReadLine();
    
            }
            catch (Exception ex)
            {
    
                Console.Write(ex.InnerException);
                Console.ReadLine();
    
            }
    

1 个答案:

答案 0 :(得分:0)

您无法连接的最可能原因是因为没有服务地址传递到ServiceHost构造函数。

在Windows服务的OnStart方法中尝试此操作:

wcfServiceHostObj = new ServiceHost(typeof(TestWCFService), 
    new Uri[] { "net.pipe://localhost/TestWCFService" });

看到“WCF主机 - 成功启动”只意味着ServiceHost没有抛出错误;它不保证WCF服务正在监听并准备好接收消息。

此外,对WCF客户端使用using语句如下:

using (channel as IDisposable)
{
    channel.SendMessage("First Message");
}

被视为bad practice