操作已超时 WCF Rest
Posted
技术标签:
【中文标题】操作已超时 WCF Rest【英文标题】:The operation has timed out WCF Rest 【发布时间】:2015-08-10 06:51:55 【问题描述】:调用我的 WCF REST 服务时,我收到以下异常 The operation has timed out
。
我基本上有一个 WCF Web 服务项目和一个引用已编译 WCF 程序集的网站。 Web 服务很有魅力,所以我的问题不在于我的 web.config 中有不正确的绑定、端点或服务定义。
只有在我尝试插入大量数据时才会出现此问题。
web.config 包含以下信息:
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime enable="true" executionTimeout="100000"
maxRequestLength="2147483647"/>
</system.web>
<bindings>
<webHttpBinding>
<binding maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"
receiveTimeout="00:10:00"
sendTimeout="00:10:00">
<readerQuotas maxStringContentLength="2147483647"/>
</binding>
</webHttpBinding>
</bindings>
项目(windows 服务)中没有引用我的 WCF Web 服务,因为我使用的是包装器 (sdk),它负责发出所有相关的 http 请求并将对象转换为 json,反之亦然。所有 http 请求都是通过称为 sdk 的 WebClient 发出的。在这种情况下:
byte[] returnBuffer = await client.UploadDataTaskAsync(uriString,
"POST", requestBuffer);
虽然这发生在一个实时站点上(哎呀!!),我可以通过在我的 Web 服务中放置一个断点并让它挂起 90 秒左右来轻松重现该问题,然后如果我尝试继续单步执行,生成特定错误,当它尝试继续运行函数中的剩余代码时,异常会返回给客户端。
我已经用谷歌搜索这个问题几个小时了,但我没有得到任何结果。我的网络服务仍然超时默认的 90 秒。
我想知道的另一件事。我一直在阅读很多不同的文章,提到客户端应用程序,在我的情况下,我的 Windows 服务应该在 app.config 中具有绑定、端点等信息。我没有,到目前为止我也不需要一个。我应该看看这个吗??看起来确实超时发生在 Web 服务而不是客户端上。
有什么想法吗?
谢谢。
更新:
我添加了有关我的 web.config 的附加信息(即服务和行为定义):
<services>
<service name="MyCompany.Web.Services.WebDataService"
behaviorConfiguration="WebDataServiceBehaviour">
<endpoint address="" binding="webHttpBinding"
contract="MyCompany.Web.Services.IWebDataService"
behaviorConfiguration="webBehaviour">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WebDataServiceBehaviour">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
【问题讨论】:
将您的绑定命名为<binding name="myWebHttpBinding" ...>...</binding>
并像这样使用它:我会说这是由于客户端超时设置造成的。您是否有客户端配置或其他方式来配置包装器?
这很难说,因为我不太了解您的包装器是如何工作的,但您希望增加绑定的超时时间。例如
<binding openTimeout="00:10:00"
closeTimeout="00:10:00"
sendTimeout="00:10:00"
receiveTimeout="00:10:00">
见here for more details
【讨论】:
嗨,马克,我没有在客户端设置任何东西。这是我想知道的事情之一。有没有机会向我展示我应该在客户端设置什么?我什至不确定它是否会读取 app.config,因为记住我正在调用 WebClient 而不是对 Web 服务的引用。 你好,马克,你是对的。我找到了这篇文章:***.com/questions/1237966/…,一旦我增加了 WebClient 的超时时间,问题似乎就消失了。我已将其设置为 10 分钟,并将其留在断点上超过 5 分钟,没有问题。我现在已经运行了 5 次相同的“上传”,并且没有一次收到原始错误或我上面提到的第二个错误,所以看起来不错,但我必须等着看明天它与客户的关系如何。再次感谢。【参考方案2】:我将回答我自己的问题,因为我想澄清一些事情:
这与 web.config 中的设置无效无关,因为问题与客户端有关。很容易假设问题与服务器端有关,但在本例中并非如此。
在客户端的 app.config 中设置 ServiceModel(地址、绑定、合同)配置毫无意义,因为我正在调用 WebClient 对象,据我所知完全不知道我正在调用的服务类型,这些设置非常特定于 WCF,虽然我的服务是 WCF REST Web 服务并且确实需要服务器端的 ServiceModel 设置,但 WebClient 对象完全不知道这些。
我的问题的答案在文章How can I change the time limit for webClient.UploadData()?中找到。做了相关的修改后,我彻底测试了,也部署到了现场,出现了超时问题,上传大量数据时问题肯定已经解决了。
谢谢。
【讨论】:
以上是关于操作已超时 WCF Rest的主要内容,如果未能解决你的问题,请参考以下文章