操作已超时 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>

【问题讨论】:

将您的绑定命名为&lt;binding name="myWebHttpBinding" ...&gt;...&lt;/binding&gt; 并像这样使用它: 【参考方案1】:

我会说这是由于客户端超时设置造成的。您是否有客户端配置或其他方式来配置包装器?

这很难说,因为我不太了解您的包装器是如何工作的,但您希望增加绑定的超时时间。例如

        <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的主要内容,如果未能解决你的问题,请参考以下文章

超时 WCF 服务

为啥 WCF 不支持服务端超时?

对 *.svc 的 HTTP 请求已超过分配的超时。分配给此操作的时间可能是较长超时的一部分。

WCF 超时太快和“连接意外关闭”异常

异步 WCF 服务超时

打开操作未在分配的 00:01:00 超时内完成 - AX 2012 使用 AIF/WCF