2009-12-04 33 views
7

我是WCF服务的开发人员。我的测试客户非常适合。但是对于真实客户端(使用相同的客户端代理),它会失败。同样的WCF服务与NetTcpBinding的工作,只有netNamedPipeBinding出现此错误,即使ConcurrencyMode = ConcurrencyMode.Single使用WCF时未找到命名管道netNamedPipeBinding

这里是

有没有终点在 net.pipe听除外://本地主机/ MyService 可以接受消息。这通常是由不正确的地址 或SOAP操作导致的 。有关更多详细信息,请参见InnerException,如果存在 。

服务器堆栈跟踪:在

System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName(URI URI)在 System.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey(的EndpointAddress 地址,乌里通过) System.ServiceModel.Channels.CommunicationPool`2.TakeConnection(EndpointAddress address,Uri via,TimeSpan timeout, TKey & key)at System.ServiceModel .Channels.ConnectionPoolHelper.EstablishConnection(时间跨度 超时)处 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时) System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels .ServiceChannel.OnOpen(时间跨度 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度 超时,CallOnceManager级联)
在 System.ServiceModel.Channels.ServiceChannel.EnsureOpene d(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.Call在 System.ServiceModel(字符串 动作,布尔单向, ProxyOperationRuntime操作, 对象[]项,对象[]奏,时间跨度 超时)。 Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 包括methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)在

异常重新抛出[0]:在 System.Runtime.Remoting.Proxies .RealProxy.HandleReturnMessage(IMessage reqMsg,即时聊天retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32类型)在

内部异常

PipeException:“管道端点' net.pipe:// localhost/MyService'在本地机器上找不到。“

+1

要说清楚 - 你的客户和你的服务在同一台机器上?如果没有命名管道将无法正常工作... – Murph 2009-12-04 18:45:08

+0

@Murph,是的,他们在同一台机器上。 – 2009-12-04 19:56:36

+0

您是否设法解决这个问题?我有同样的问题。 – Tsury 2015-02-08 16:57:32

回答

18

堆栈跟踪显示客户端WCF通道堆栈尝试从服务URL派生实际名称的命名管道正在使用的服务。该服务通过在a named shared memory section中放置一个包含GUID作为其字段之一的小结构来发布管道名称(这是每次重新启动服务时都会更改的GUID)。用于共享内存部分的名称是通过应用编译到NetNamedPipeBinding的服务器端和客户端WCF代码中的算法从服务URL派生的。

在问题中报告的异常事实上意味着已经将该算法应用于服务URL以提供名称,客户端代码无法打开该名称的共享内存部分的句柄。正如异常消息所述,这可能意味着没有服务监听用于派生名称的服务URL。但它可能意味着内存部分在那里,服务也是如此,但客户端代码不在允许访问共享内存的安全上下文中运行。

在Vista之前的Windows平台上,WCF客户端不太可能缺少打开共享内存的安全权限,从中读取管道名称GUID,然后成功连接到服务管道。但是在Vista和更高版本的平台上有新的安全机制,这使得这是一个更常见的故障情况。

Vista为已命名的内核对象引入了不同名称空间的概念:每个登录会话都有一个全局(机器范围)名称空间和一个专用名称空间。 NetNamedPipeBinding客户端代码将在查找通告管道名称的共享内存部分时尝试命名空间。如果服务器使用全局名称创建了共享内存,或者如果服务和客户端在同一个登录会话中运行,则客户端将查找它正在查找的内容。但是,如果服务无法在全局名称空间中创建一个对象(它总是首先尝试这样做),那么它将回退到创建私有会话名称空间,然后只有在同一会话中运行的客户端才能看到它。创建全局名称空间内核对象需要Vista和更高版本平台中的特殊权限,这些平台通常只有运行“以管理员身份”运行的Windows服务进程和应用程序。一个常见的错误是尝试在Windows服务中创建一个客户端,试图连接到在交互式用户会话中运行的应用程序中托管的WCF NetNamedPipe服务。

如果客户端代码运行在比托管服务的代码更低的完整性上下文(例如浏览器插件)中,Vista强制性完整性机制也可以阻止假定的客户端连接到WCF NetNamedPipeBinding服务。

我会想象在问题中报告的症状,测试客户端工作但真正的客户端不工作,几乎肯定是由真实客户端的安全上下文与服务主机的安全上下文不一致造成的,这些原因。

+0

这是我的实际问题的确切答案。为了记录,我只需启动具有管理权限的Visual Studio即可使其工作。另外,从命令提示符启动客户端和服务器是一种解决方案。非常感谢您的详细解答! – BeardinaSuit 2013-02-25 18:25:11

+1

是的,但是如果我不想以管理员身份运行它,该怎么办?我的进程在同一个会话上。 – Tsury 2015-02-08 16:57:57

3

通过客户端使用的端点必须匹配您的WCF服务公开的终结点。这意味着地址/装订/合同中指定的客户端终结点的元组必须正是匹配的地址/装订/合同如果您使用app.config方法,请确保WCF服务和客户端配置文件中的所有内容都拼写正确,如果要以编程方式添加端点,请确保您没有使用WCF服务。 t拼写错误代码

+0

感谢您发布此信息,但这不是我的情况。 – 2009-12-05 00:17:08

+0

在这种情况下登录是否重要?如果用户拥有的进程可以访问其他用户创建的命名管道? – 2009-12-05 00:18:29

+0

我不确定。我使用命名管道从本地登录客户端与同一台计算机上的系统帐户Windows服务通信,没有问题。 – 2009-12-05 00:22:27

4

另一种可能解决这个问题的根源,如果寻找这个错误,碰到这个岗位来 - 如果你得到一个错误,没有net.pipe地址可在您的网址找到(即http://localhost:1234/MyService/etc/请确认Net.Pipe Listener适配器 Windows Service是开始。 (我也开始Net.Tcp侦听适配器)

该服务似乎没有启用或在某些情况下启动,尤其是当部署到一个远程服务器,可能没有安装很多开发工具,积极使用这些服务。启动服务解决了问题。

+0

这正是我的问题所在......我的网站一直在正常工作,然后突然停止。启动服务后,一切运行良好。 – Arnaud 2013-04-02 00:51:52

+0

哈利路亚!对于将来的读者:::要安装这个Windows服务,我相信这个路径是:::“打开或关闭Windows功能”/ /“/ .NET Framework 4.6高级服务”///“WCF服务”/// “命名管道激活”(如果此服务未出现在Windows服务列表中,则必须安装它)。谢谢! – granadaCoder 2017-07-20 16:03:08