我注意到2147483647似乎是maxReceivedMessageSize的流行选择,但这是限制吗?
几天前,我成功实现了Windows服务中托管的WCF服务.StackOverflow的社区帮助我在这里进行了WSDL曝光.我再次感谢你.但是最近我发现这次服务还有另一个潜在的客户端,它位于与服务相同的机器上,这使我认为我应该使用namedPipesBinding添加另一个端点.
就我而言,命名管道似乎是机内通信的最佳解决方案.如果这是错误的请纠正我.
我需要为同一服务/合同公开另一个端点,但这次使用netNamedPipeBinding.但是我真的不明白如何从客户端添加服务引用.加入后愚蠢地说
<endpoint address="net.pipe://localhost/OfficeService"
binding="netNamedPipeBinding"
contract="netBridge.Development.OfficeService.IWordService"
bindingConfiguration="localBinding" />
Run Code Online (Sandbox Code Playgroud)
我试图在位于同一台机器上的Windows窗体应用程序中添加一个服务引用,键入net.pipe:// .... url.它没用.我必须提到我之前删除了mex(MetaData Exchange)端点,因为我认为没有必要.
我是WCF服务的开发人员.我的测试客户工作得很好.但是当谈到真正的客户端(使用相同的客户端代理)时,它就失败了.相同的WCF服务与netTcpBinding一起使用,只有netNamedPipeBinding才会出现此错误,即使使用ConcurrencyMode = ConcurrencyMode.Single也是如此.
这是例外
在net.pipe:// localhost/MyService上没有可以接受该消息的端点.这通常是由错误的地址或SOAP操作引起的.有关更多详细信息,请参阅InnerException(如果存在).
服务器堆栈跟踪:at
系统.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey(EndpointAddress地址,Uri via)在System.ServiceModel.Channels.CommunicationPool`2.TakeConnection(EndpointAddress地址,Uri via)上的System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName(Uri uri) ,Time.San超时,TKey和密钥)在System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan超时)的System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan超时),System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时)at at在System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan超时,CallOnceManager级联)的System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时)的System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan超时)
System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)at System.ServiceModel.Channels.ServiceChannel.Call(String action,Boolean oneway,ProxyOperationRuntime operation,Object [] ins,Object [] outs,TimeSpan timeout)at System. System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)中的ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime操作)在[0]处重新抛出异常:在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)处于System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32 type)at at
内在例外
PipeException:"在本地计算机上找不到管道端点'net.pipe:// localhost/MyService'."
我有一个由几个WCF服务组成的应用程序,其中一些服务在Workflow Foundation(.NET 3.5)中实现,其他服务只是简单的C#.出于性能原因,这些服务通过netNamedPipeBinding相互通信.麻烦的是,一旦系统负载增加,我就会看到越来越多的CommunicationExceptions和底层的PipeExceptions.有趣的是,这些交易似乎最终完成.其中一个原因是我们在工作流中有一个重试机制,但即使我在WCF跟踪中看到这些错误,即使来自普通C#服务的调用也会成功.在Windows的命名管道子系统中有什么重试机制吗?
但是,我希望修复这些错误,或者至少了解潜在的问题.我觉得它们正在影响应用程序的性能和稳定性.如果我没有看到来自服务本身的任何其他异常,我该如何正确地诊断和诊断这些错误的根本原因?
以下是我得到的一些例外情况:
PipeException: 从管道读取错误:管道已结束.(109,0x6d).
和:
PipeException: 由于管道已关闭,因此无法完成操作.这可能是由管道另一端的应用程序引起的.
在TimeoutException中: 管道连接已中止,因为管道的异步读取未在分配的超时00:02:00内完成.分配给此操作的时间可能是较长超时的一部分.
现在超时异常似乎来自系统处理负载的问题.这些操作通常很小,但它们的数量似乎是问题所在.或者这可能是先前管道连接的结果被终止而没有返回池中?
我已尝试在WCF配置中尝试使用serviceThrottling行为来增加实例数等,但这些错误不断涌现.有小费吗?
/编辑:我确实打开了WCF跟踪和消息记录.这就是我看到PipeExceptions和CommunicationExceptions的地方.应用程序本身没有显示任何错误.我们已经对WCF服务进行了相当多的检测,以便使用log4net记录所有异常,并且我根本看不到这些日志中的任何错误.这一切似乎都发生在WCF级别.
我试图在同一台机器上运行多个WCF服务托管应用程序.
我想在一个应用程序中运行多个应用程序 - 而不是多个服务.
var host = new ServiceHost(typeof(MyClass1), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISomeInterface), new NetNamedPipeBinding(), "FOO");
host.Open();
Run Code Online (Sandbox Code Playgroud)
我为每个应用程序更改"FOO",但仍无法启动多个服务.猜猜它很简单,但我卡住了:(
问候
鉴于:
- 应用程序 - 桌面GUI(WPF).NET应用程序
- 监视应用程序的Windows服务(.NET也)
Windows服务定期"ping"应用程序以确保它是健康的(如果它不是winservice将重新启动它).
我打算通过命名管道实现"pinging".为了简单起见,我决定使用WCF.该应用程序托管一个WCF服务(一个操作Ping返回一些东西).Windows服务是此WCF服务的客户端,基于计时器定期调用它.
这一切都在Windows 7中
.Windows服务在LocalService下运行(在会话#0中).
桌面应用程序在当前登录的用户下运行(在会话#1中).
问题:
Windows服务无法在桌面应用程序中看到创建并正在侦听的WCF端点(使用NetNamedPipeBinding).这意味着通过wcf代理调用时,我得到了这个异常:"在本地计算机上找不到管道端点'net.pipe:// localhost/HeartBeat'"
我确信代码没问题,因为另一个桌面应用程序(在会话#1中)可以看到端点.
显然,我在处理Win32系统对象隔离的一些安全性问题.但我相信应该有办法解决我遇到过的限制问题.
我可以牺牲WCF方法并采用原始的NamedPipe方式.
本周我一直试图加快命名管道的速度.我试图用它们解决的任务是,我有一个现有的Windows服务,它充当设备驱动程序,将数据从外部设备汇集到数据库中.现在我必须修改这个服务并添加一个可选的用户前端(在同一台机器上,使用一种IPC形式),它可以在设备和数据库之间传递数据时监控数据,并将一些命令发送回服务.
我对IPC的初步想法是命名管道或内存映射文件.到目前为止,我一直在使用WCF教程基本进程间通信来完成命名管道的想法.我的想法是使用一个实现WCF NamedPipe服务的附加线程来设置Windows服务,并将其用作我的驱动程序内部的管道.
我有示例代码工作,但是我无法理解2个问题,我希望有人可以帮助我:
在本教程中,ServiceHost使用typeof(StringReverser)进行实例化,而不是通过引用具体类来实例化.因此,似乎没有服务器与服务本身交互的机制(在host.Open()和host.Close()行之间).是否可以在服务器和实际实现服务的类之间创建链接并传递信息?如果是这样,怎么样?
如果我运行服务器的单个实例然后运行多个客户端实例,则似乎每个客户端都获得服务类的单独实例.我尝试将一些状态信息添加到实现该服务的类中,并且它仅保留在命名管道的实例中.这可能与第一个问题有关,但是无论如何强制命名管道使用实现服务的类的相同实例?
最后,有关MMF与命名管道的任何想法吗?
编辑 - 关于解决方案
根据Tomasr的回答,解决方案在于使用正确的构造函数来提供实现服务的具体单例类(ServiceHost Constructor(Object,Uri [])).我当时没有意识到的是他提到确保服务类是线程安全的.天真地只是更改构造函数导致服务器崩溃,这最终导致我从这个博客条目Instancecontextmode和Concurrencymode了解InstanceContextMode .设置正确的上下文很好地完成了解决方案.
我正在收到"没有端点监听net.pipe:// localhost"错误,如其他地方所述,但我似乎无法找到真正的答案.
这是问题的一个很好的标识:http: //kennyw.com/indigo/102
使用WCF时,Windows身份验证是通过SSPI-Negotiate执行的,在大多数情况下,它将选择Kerberos作为实际的身份验证机制.但是,如果传递给SSPI的目标SPN是本地计算机帐户的格式良好的SPN(例如主机/ [dns机器名称]),那么Negotiate将使用NTLM(环回优化),并且访问令牌将不具有网络SID(和因此可以与NetNamedPipes一起使用).
但它并没有告诉我如何解决这个问题.我以编程方式创建我的端点.
var binding = new NetNamedPipeBinding();
binding.Security.Mode = NetNamedPipeSecurityMode.Transport;
binding.Security.Transport.ProtectionLevel = ProtectionLevel.EncryptAndSign;
var id = EndpointIdentity.CreateSpnIdentity("host/" + Environment.MachineName);
var endpointAddress = new EndpointAddress(new Uri(serviceClientUrl), id);
var client = new ServiceClient(binding, endpointAddress);
Run Code Online (Sandbox Code Playgroud)
我猜我的问题出在CreateSpnIdentity中,但我不确定要使用什么值.
附加信息: 详细说明这一点以获取更多背景信息.Wcf服务作为在NetworkService帐户下运行的Windows服务托管(我尝试过本地系统).使用默认的NetNamedPipeBinding构造函数创建服务:
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ServiceName");
Run Code Online (Sandbox Code Playgroud)
我创建了一个使用此服务的SharePoint Webpart.问题是,如果SharePoint站点设置为基于表单的身份验证,或者只是在Windows身份验证下的URL中使用了计算机名称,那么就没有问题.仅当在Windows身份验证下将完全限定的计算机名用于URL时才会出现上述错误.
我很确定这与文章中描述的NTLM Kerberos问题有关,但我不确定如何绕过它.
我是WCF和命名管道的新手.
我需要一种方法在同一台机器上的UI应用程序和Windows服务之间进行安全通信.这就是我需要的: - 客户端UI应用程序需要将各种消息类型发送(推送)到Windows服务. - 客户端UI应用程序需要将从服务(推送或拉取)接收各种消息类型.
(此处的消息只是结构化的序列化数据).
现在所有这些交换只能在授权用户帐户下进行(可能与服务帐户不同).所以我在考虑为服务和用户帐户ACL命名一个命名管道.
但是,命名管道仅支持流.我有多种类型的消息需要通过命名管道进行交换,这意味着我需要定义它们并对它们进行序列化/反序列化.
为了避免这种情况,我想到了在命名管道上使用WCF(用于序列化和RPC支持).还在Windows服务中托管WCF服务.
问题1)这是一个好方法吗?我在WCF下使用http或tcp时犹豫不决,因为通信必须保留在机器内.
问题2)我是否以及如何对WCF将使用的命名管道进行ACL?这是我可以控制的吗?我觉得使用特定SID对名称管道进行ACL操作可以提供更好的安全性,而不是在客户端和服务器之间实现身份验证方案.
感谢您的任何指示,建议!萨米尔