以一种简单的方式,我们需要通过WCF命名管道进行outproc通信。在开发中,客户端和服务组件的应用程序都通过IOC在同一个可执行文件中实例化。
服务主持人:
/// <summary>
/// Default constructor
/// </summary>
public OpaRuntimeServiceHost(string serviceName, string hostAddress)
{
_serviceHost = new ServiceHost(typeof(OpaRuntimeService), new Uri[] {
new Uri(string.Format("net.pipe://{0}/opa/{1}", hostAddress, serviceName))
});
_serviceHost.AddServiceEndpoint(typeof(IOpaRuntimeService), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), serviceName);
_serviceHost.Open();
}
客户端:
/// <summary>
/// Default constructor
/// </summary>
/// <param name="hostAddress"></param>
/// <param name="serviceName"></param>
public OpaRuntimeServiceClient(string serviceName, string hostAddress)
: base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IOpaRuntimeService)),
new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(string.Format("net.pipe://{0}/opa/{1}", hostAddress, serviceName))))
{
}
这两个都是成功构建的,但是当客户端调用服务时,它会生成此错误:
net.pipe:// localhost / opa / runtime没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。
不幸的是,没有内在的例外。根据其他问题,我确保Net.Pipe监听器服务正在运行。 Visual Studio运行时具有提升的权限。
Windows 10上的VS2015或Windows 7上的VS2012。
我错过了什么吗?
答案 0 :(得分:0)
我认为对AddServiceEndpoint的调用需要端点的地址(根据MSDN documentation)。在您的示例代码中,看起来您只传递了serviceName。
我挖出了一些做类似事情的示例代码。但是,在我的示例中,我来自ServiceHost:
public class CustomServiceHost : ServiceHost
{
public CustomServiceHost() : base(
new CustomService(),
new[] { new Uri(string.Format("net.pipe://localhost/{0}", typeof(ICustomService).FullName)) })
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
foreach (var baseAddress in BaseAddresses)
{
AddServiceEndpoint(typeof(ICustomService), new NetNamedPipeBinding(), baseAddress);
}
}
}
答案 1 :(得分:0)
弄清楚了。服务名称在服务主机设置中使用了两次,因此应该包含net.pipe:// localhost / opa / runtime / runtime,它应该包含:net.pipe:// localhost / opa / runtime。谢谢你的橡皮鸭。