繁体   English   中英

WCF Windows服务TimeOut

[英]WCF Windows Service TimeOut

我有一个在.net中开发的客户端应用程序向wcf服务发送请求并且应该发送响应。如果执行时间在1分钟内,则没有错误,如果超过1分钟则错误是

内部异常:发送到net.tcp:// localhost:18001 / PitToPort / 2008/01/30 / StockpileService / tcp的请求操作未在配置的超时(00:01:00)内收到回复。
分配给此操作的时间可能是较长超时的一部分。 这可能是因为服务仍在处理操作,或者因为服务无法发送回复消息。 请考虑增加操作超时(通过将通道/代理强制转换为IContextChannel并设置OperationTimeout属性)并确保该服务能够连接到客户端

如何增加时间以及如何? 什么是最好的解决方案?

注意,这个错误消息是WCF发送的样板字符串,当它不知道发生了什么。 这真的意味着“mmh链条出了问题,但我不确定是什么,所以,这里有一些关于配置的琐事,做你想做的事情”。

大多数时候,当你收到这条消息时,它与实际的超时无关。 它可以是配额(图中的对象数,总大小,数组长度)或服务器端出错的东西,在服务方法返回结果和实际字节通过网络发送之间。 所以,你应该检查你的配置设置(而不是超时,除非你必须等待一分钟才能得到错误。如果你马上得到错误,它与任何超时无关)。

这个无用的消息是我的WCF烦恼列表之上。

超时称为“sendTimeout”,您可以在配置文件的绑定部分或代码中配置它 - 您的选择。

配置:

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding sendTimeout="00:03:00" />
      </netTcpBinding>
    </bindings>

这会将超时设置为3分钟。

我已将以下代码添加到服务应用程序代码中

system.transactions  
    defaultSettings timeout="00:30:00" 

使用此代码,服务将等待30分钟,以便在数据库服务器中完成进程并增加

maxBufferSize="2147483647"  
maxReceivedMessageSize="2147483647"  
maxBufferPoolSize="2147483647" 

在客户端绑定属性,然后它工作正常。

问题:服务正在发送响应,但客户端缓冲区大小较少,我增加到最大缓冲区大小。

我遇到了同样的错误。 具体来说,我收到的例外是:

System.ServiceModel.CommunicationException:套接字连接已中止。 这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。 本地套接字超时为'00:09:59.9940000'。

System.IO.IOException:写入操作失败,请参阅内部异常。

System.ServiceModel.CommunicationException:套接字连接已中止。

这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。

本地套接字超时为'00:09:59.9940000'。

System.Net.Sockets.SocketException:远程主机强制关闭现有连接

我的问题的原因是由于我的WCF客户端发送到WCF主机的消息的大小。 显然,消息的大小太大了。

为解决此问题,我将主机Web.Config maxReceivedMessageSize属性从2097152更改为8000000 ,错误不再保留。

这是我所指的Web.Config的属性:

<netTcpBinding>
<binding name="NetTCPBinding" maxReceivedMessageSize="8000000">
....
</binding>
</netTcpBinding>

我选择的8M消息大小取决于我“认为”消息大小的大小。 我不知道如何明确确定从客户端传递到主机的实际WCF消息的大小。

检查一下,对于类似类型的错误,你必须设置OperationTine属性http://www.codeproject.com/KB/WCF/WCF_Operation_Timeout_.aspx

如果您知道服务器为什么花了一分多钟来响应客户端,那么您应该扩展通道的OperationTimeout(如错误消息中所述)。

看看这个,包括最后的代码示例: http//final-proj.blogspot.com/2009/09/wcf-timeouts.html

祝好运。

这是一个更简单的解决方案......只需在当前的ClientBase上直接设置属性即可。 换句话说,首先添加一个服务引用,初始化它,然后设置属性“InnerChannel.OperationTimeout”

NetUtilsWCF.SMTPDiagClient sClient = new NetUtilsWCF.SMTPDiagClient();

sClient.InnerChannel.OperationTimeout = new TimeSpan(0,5,0);

我在使用回调时遇到了同样的异常。它在本地测试中工作(客户端和服务程序在同一台机器上运行)但在用户环境中不起作用(服务程序在winserver 2008中运行)。 服务器代码已根据日志执行。我认为这是因为环境或权限问题,但不知道如何处理。

如果在更正配置文件后遇到问题,则可能需要检查此属性。 "OperationContract(IsOneWay:=True)". 如果您错过了IsOneWay:=True属性,则可能会导致此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM