WCF Windows服务TimeOut

时间:2009-05-28 05:19:08

标签: .net windows wcf web-services exception-handling

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

  

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

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

9 个答案:

答案 0 :(得分:62)

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

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

这条无用的讯息在我的WCF烦恼列表之上。

答案 1 :(得分:14)

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

配置:

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

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

马克

答案 2 :(得分:4)

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

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

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

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

在客户端绑定属性中,它可以正常工作。

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

答案 3 :(得分:1)

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

  

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

     

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

     

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消息的大小。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

祝你好运。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:-1)

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

答案 8 :(得分:-3)

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