我正在使用在4.5 .Net Framework上使用C#构建的两个应用程序
希望他们使用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();
}
答案 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。