错误400(错误请求):我的WCF服务没有考虑maxReceivedMessageSize

时间:2012-04-06 09:58:13

标签: .net wcf soap web-config wcf-binding

  

关于SO(几乎相同的标题)有多个相关的问题,它们都没有帮助我   解决我的问题。请不要在重复之前将我的问题关闭   阅读它。感谢。

我目前正在使用WCF来公开Web服务(SOAP,HTTP)。它现在部署在IIS Express中。我的问题是,我无法从我的客户端使用我的服务。我的客户收到HTTP Error 400 Bad request个例外。

然后我在服务器端激活了跟踪,看看实际发生了什么,这就是我得到的:

enter image description here

我已将错误消息翻译成英文:The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.

实际上非常不言自明。由于我的SOAP消息很重,它可能超过了64KB的限制。

我决定在绑定配置中扩展此限制。所以这是我的web.config(服务器端):

<services>
  <service name="MyServiceName">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration="MyBindingConfiguration"
              bindingNamespace="http://my_namespace"
              contract="XXX.IMyContract" />
  </service>
</services>

<bindings>
  <basicHttpBinding>
    <binding name="MyBindingConfiguration"
             allowCookies="true"
             maxReceivedMessageSize="2147483647"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647">
      <readerQuotas maxDepth="32" maxArrayLength="2147483647" maxStringContentLength="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>

如您所见,所有尺寸都设为int.MaxValue

我还修改了我的客户端app.config,这里是:

<bindings>
  <basicHttpBinding>
    <binding name="MyBindingName"
             allowCookies="false"
             bypassProxyOnLocal="false"
             hostNameComparisonMode="StrongWildcard"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             messageEncoding="Text"
             textEncoding="utf-8"
             transferMode="Buffered"
             useDefaultWebProxy="true">

      <readerQuotas maxDepth="32"
                    maxStringContentLength="2147483647"
                    maxArrayLength="16384"
                    maxBytesPerRead="4096"
                    maxNameTableCharCount="16384" />

      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>

    </binding>
  </basicHttpBinding>
</bindings>

<client>
  <endpoint address="http://localhost:8083/myAddress.svc"
            binding="basicHttpBinding"
            bindingConfiguration="MyBindingName"
            contract="IMyContract"
            name="MyBindingName" />
</client>

然后我重新部署了我的服务,问题仍然存在(客户端HTTP 400, Bad request +服务器端MaxReceivedMessageSize limited to 65536)。

然后我用一个非常小的SOAP消息来测试我的服务:一切都很好。所以问题实际上是我的消息大于64KB。

我昨天花了2个小时试图弄清楚我的配置有什么问题...可能是显而易见的事情,但我找不到......

我已经搜索了很多关于这个问题的信息,95%的问题是开发人员忘记在服务端点中指定bindingConfiguration属性。正如您在上面的web.config中所看到的,对我来说没问题。

然后我找到了another question on stackoverflow about the (almost) same issue

正如作者在他的问题中所说,将绑定配置的名称设置为string.Empty“修复了”问题:

<services>
  <service name="MyServiceName">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration=""
...

<bindings>
  <basicHttpBinding>
    <binding name=""
...

使用默认绑定时,一切正常。我不能使用此解决方法修复我的问题,因为我需要在同一个web.config中指定多个不同的绑定配置。

我在这里重新创建一个问题,因为它实际上并不是相同的条件:我的服务不是自托管的,而是托管在IIS Express中(或IIS 7.5,经过测试,同样的问题)。

我找到了一个similar issue here的自托管服务,问题与这个特殊性有关。所以我认为这两个问题之间有一些不同。

我猜我的配置有些明显错误,但我找不到。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:4)

乍一看似乎一切都很好 - 唯一的一点是:<service name=".....">属性必须与完全匹配到完全限定的服务实现类(包括所有名称空间等) - 是那个案子??

我问,因为你有contract="XXX.IMyContract"表示命名空间,但你的<service name="....">属性没有暗示任何命名空间。

答案 1 :(得分:0)

尝试使用以下服务中的web-config设置:

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
    <standardEndpoints>

            <webHttpEndpoint>
                <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"                                        
                                  crossDomainScriptAccessEnabled="true" 
                                  maxReceivedMessageSize="2147483647" 
                                  maxBufferSize="2147483647" 
                                  maxBufferPoolSize="4194304" />
            </webHttpEndpoint>

    </standardEndpoints>

    <bindings>
        <webHttpBinding>
            <binding>
                <readerQuotas maxStringContentLength="2147483647"/>
            </binding>
        </webHttpBinding>
    </bindings>

</system.serviceModel>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>