C# 接收对wcfservice.svc的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议造成的

C# 接收对wcfservice.svc的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议造成的,c#,web-services,wcf,C#,Web Services,Wcf,我在IIS 6.0下部署了wcf服务。服务方法接受对象列表并返回相同的列表 List<CustomObject> ProcessImageData(List<CustomObject> lstData) List ProcessImageData(List lstData) 对象可能包含大量html数据。该服务目前几乎不需要几秒钟来完成请求,但我得到了以下2个例外吨 “请求通道在00:00:59.999999之后等待答复时超时。请增加传递给请求调用的超时值或增

我在IIS 6.0下部署了wcf服务。服务方法接受对象列表并返回相同的列表

    List<CustomObject> ProcessImageData(List<CustomObject> lstData)
List ProcessImageData(List lstData)
对象可能包含大量html数据。该服务目前几乎不需要几秒钟来完成请求,但我得到了以下2个例外吨

“请求通道在00:00:59.999999之后等待答复时超时。请增加传递给请求调用的超时值或增加绑定上的SendTimeout值。分配给此操作的时间可能是更长超时的一部分。”

“接收对的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议。这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。”

下面是我的配置文件的样子

web.Config(服务)文件

客户端配置文件

其中一个例外建议增加sendTimeout值,该值当前设置为1分钟。我增加了它,但它似乎没有改善任何东西,我仍然得到这些例外

问题: 为什么我会遇到这些异常?我可以做些什么来防止这种情况

此外,还有一个异常记录在IIS服务器上的事件日志中

异常类型:System.ArgumentException 消息:参数无效。 参数名称:NULL 数据:System.Collections.ListDictionaryInternal TargetSite:Void.ctor(Int32,Int32,System.Drawing.Imaging.PixelFormat) 帮助链接:空 资料来源:系统图

堆栈跟踪信息


at System.Drawing.Bitmap..ctor(Int32宽度、Int32高度、像素格式) 在System.Drawing.Bitmap..ctor(Int32宽度,Int32高度)
在C:_tfs\ImagingSystem\Development\Dev\Source\Wcf\WcfServices\HtmlToPngService\HtmlToPngService.svc.cs中的WcfService.CreateBitmap(WebBrowser和browser):第126行

也需要增加web.config(服务)中的超时值。大概是这样的:

<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IHtmlToImageService"
             openTimeout="00:10:00" 
             closeTimeout="00:10:00" 
             sendTimeout="00:10:00" 
             receiveTimeout="00:10:00">
    </binding>
  </wsHttpBinding>
</bindings> 

我建议查看以下链接:


在这种情况下,可能会出现一些问题。首先,WCF的默认配置非常安全。这就是为什么传入请求的大小是有限制的。默认情况下,该限制非常小(65536字节)。如果请求大于此值,则需要配置,并将其设置为要支持的最大字节数。在服务器上接收传入请求,在客户端接收传入响应。这可能是第二个错误的原因,您应该能够在服务日志中找到对此的引用。

接下来,IIS对传入请求的大小有自己的限制。此限制的默认值为30000000字节(约30MB)。如果您的请求大于此值,您还应该增加该限制(有关更多信息,请参阅),因为WCF甚至不会看到传入的请求,因为IIS会在它到达之前阻止它。您描述的超时错误可能会在这种情况下发生,因为当IIS收到超过配置限制的请求时,它甚至不会发送响应,因为它认为自己受到了攻击。

请仔细考虑这些值,并记住maxReceivedMessageSize隐式配置WCF将分配的缓冲区,以将接收到的消息放入。我在生产系统中看到该值设置为Int32.MaxValue。因此,当服务器试图分配2GB的RAM来接收每个请求时,整个服务器很容易被几个巨大的并发请求破坏。

您可以首先分析异常。在VisualStudio中执行以下异常设置并启用“公共语言运行时异常”

大多数情况下,您可以使用此工具获得异常的详细信息。
我之所以出现此异常,是因为在我的模型中有一个字段是必需的,我的响应为null,并且由于客户端的原因,我的对象无法正确反序列化。

看起来服务端发生了一些灾难性异常,导致服务中断。检查windows事件日志,查看是否记录了任何异常。启用另一个选项-List ProcessImageData(List lstData)-所有列表/IEnumerables都由WCF转换为数组。所以这是一个等价的服务操作契约CustomObject[]ProcessImageData(CustomObject[]lstData)正确,但它对我面临的任何事情有什么影响?谢谢Marc。很抱歉,我忘记粘贴LargeSizeMessages配置设置,其中已定义为maxReceivedMessageSize=“2147483647”>。请参阅web.config(服务)文件。你能再看一次吗。谢谢您是否阅读了有关IIS请求筛选的部分?如果您的请求大小超过30 MB,WCF甚至不会看到它们,因为它们被IIS阻止。您可以在web.config中配置传入请求的最大大小
    <wsHttpBinding>
      <binding name="WSHttpBinding_IHtmlToImageService" closeTimeout="00:10:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
          realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>
    </wsHttpBinding>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IHtmlToImageService"
             openTimeout="00:10:00" 
             closeTimeout="00:10:00" 
             sendTimeout="00:10:00" 
             receiveTimeout="00:10:00">
    </binding>
  </wsHttpBinding>
</bindings>