WCF错误 - 意外响应:(400)错误请求

时间:2010-11-15 17:08:44

标签: asp.net wcf web-config azure

我无法找到这个问题的答案。通过调整web.config文件中的一些最大大小设置,似乎可以修复大多数类似的帖子。但是,这些建议都没有解决我的问题。

为了提供更多背景知识,我将asmx Web服务移植到Windows Azure中托管的WCF Web服务。测试期间出现了这个问题。如果我在一次调用中将少量事务传递给我的webservice,它往往可以正常工作。当我的交易规模达到50-60(交易)时,会出现此错误。序列化为xml,文件大小约为300K,所以它没有什么大不了的。但它确实倾向于倾向于规模问题。

此外,打开WCF跟踪,我发现以下异常发生:

  

System.ServiceModel.ProtocolException:已超出传入邮件的最大邮件大小限额(65536)。要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性。

     

at System.ServiceModel.Channels.HttpInput.ThrowHttpProtocolException(String message,HttpStatusCode statusCode,String statusDescription)

     

at System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded()

     

在System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream inputStream)

     

at System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception& amp; amp; requestException)

     

在System.ServiceModel.Channels.HttpChannelListener.HttpContextReceived(HttpRequestContext context,Action callback)

因此,从异常情况来看,如果在我的web.config中关闭了其中一个设置,但这是看起来像:

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    <behavior name="MetadataEnabled">
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="true"/>
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <add scheme="http" port="8081"/>
          <add scheme="https" port="444"/>
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>
      <dataContractSerializer maxItemsInObjectGraph="111024000"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service name="Bandicoot.Core" behaviorConfiguration="MetadataEnabled">
    <endpoint name="HttpEndpoint"
              address=""
              binding="wsHttpBinding"
              bindingConfiguration="wsHttp"
              contract="Bandicoot.CORE.IRepricer" />
    <endpoint name="HttpMetadata"
              address="contract"
              binding="mexHttpBinding"
              bindingConfiguration="mexBinding"
              contract="Bandicoot.CORE.Stack" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/Core"/>
      </baseAddresses>
    </host>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="wsHttp" maxReceivedMessageSize="111024000" 
             messageEncoding="Text" maxBufferPoolSize="111024000" 
             textEncoding="UTF-8">
      <readerQuotas maxBytesPerRead="111024000"
                    maxArrayLength="111024000"
                    maxStringContentLength="111024000"/>
      <security mode="None"/>
    </binding>
  </wsHttpBinding>
  <mexHttpBinding>
    <binding name="mexBinding"/>
  </mexHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

有没有人有任何其他建议,或者我的web.config中有什么错误配置我还没看到?

感谢您的任何建议!

编辑:以下是我客户的app.config

中的设置
<bindings>
<basicHttpBinding>
    <binding name="BasicHttpBinding_CORE" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="14194304" maxBufferPoolSize="14194304" maxReceivedMessageSize="14194304"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
        <readerQuotas maxDepth="1000" maxStringContentLength="111024000"
            maxArrayLength="111024000" maxBytesPerRead="1024000" maxNameTableCharCount="111024000" />
        <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
    </binding>
</basicHttpBinding>

编辑:添加其他客户信息:

        <client>
        <endpoint address="http://localhost:92/CORE.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_CORE" contract="Core.CORE"
            name="BasicHttpBinding_CORE" />
    </client>

编辑:尝试将服务绑定更改为basicHttpBinding - 配置更改:

      <basicHttpBinding>
    <binding name="basicHttp" maxReceivedMessageSize="111024000"
             messageEncoding="Text" maxBufferPoolSize="111024000"
             textEncoding="UTF-8">
      <readerQuotas maxArrayLength="111024000" maxBytesPerRead="111024000" maxStringContentLength="111024000"/>
      <security mode="None" />
    </binding>
  </basicHttpBinding>

      <service name="Bandicoot.Core" behaviorConfiguration="MetadataEnabled">
    <endpoint binding="basicHttpBinding"
              bindingConfiguration="basicHttp"
              contract="Bandicoot.CORE.IRepricer" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              bindingConfiguration="mexBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/Core"/>
      </baseAddresses>
    </host>
  </service>

客户端的app.config以及参考:

        <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_CORE" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="100000000"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" 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:92/CORE.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_CORE" contract="Core.CORE"
            name="BasicHttpBinding_CORE" />
    </client>

4 个答案:

答案 0 :(得分:2)

您需要在客户端上设置maxReceivedMessageSize (您从服务中返回的消息是传入的) - 在其app.config或{{1 }}:

web.config

<system.serviceModel> <bindings> <wsHttpBinding> <binding name="wsHttp" maxReceivedMessageSize="111024000" messageEncoding="Text" maxBufferPoolSize="111024000" textEncoding="UTF-8"> <readerQuotas maxBytesPerRead="111024000" maxArrayLength="111024000" maxStringContentLength="111024000"/> <security mode="None"/> </binding> </wsHttpBinding> <mexHttpBinding> <binding name="mexBinding"/> </mexHttpBinding> </bindings> <client name="whatever"> <endpoint name="HttpEndpoint" address="" binding="wsHttpBinding" bindingConfiguration="wsHttp" contract="Bandicoot.CORE.IRepricer" /> </client> </system.serviceModel> 的默认值为64K,除非您更改它。

答案 1 :(得分:1)

我终于在今天早上想出了这个。问题是我的服务没有使用我认为的配置设置。原因?配置中的服务名称必须是正在实施的服务的完全限定路径。

我发现这link有助于搞清楚。

我发现我的服务工作没有指向实际端点有点奇怪,我想它只是使用了一系列默认值,如果你想要不同的东西,你可以在web.config中配置它们吗?我认为这解释了为什么我在客户端使用webservice而不是wsHttpBinding时获得了basicHttpBinding。

花了几天才弄明白,但是很有教育意义。谢谢你的建议!

答案 2 :(得分:1)

我遇到了同样的错误,原因也被证明是配置错误。

但就我而言,就像marc_s已发布的那样,服务器端上的 maxReceivedMessageSize 设置。服务器仍在使用其默认配置,该配置低至64 kb。

现在听起来很明显,我花了很长时间才发现错误不在我(客户)方面。

我希望这可以帮助别人。

答案 3 :(得分:0)

嗨问题海报“Brosto”!

这将补充你的2010年11月17日15:29回答。

我们有一个“有趣”,或者我今天应该说“教育”生产部署测试问题,这个问题花费了大部分时间来解决,而这实际上是由一次击键造成的。在我们发现Web Farm完全部署后问题消失后,我们才确认问题的根源。

这是原因。当我们测试我们的生产部署,并通过更改我们的主机文件来对抗“单一服务器”时,我们绕过了Load Balancer,对单个服务器的调用最终会超过默认的http端口 80 !当我们针对“负载均衡器”进行测试时,从Load Balancer调用单个服务器最终将通过Load Balancer定义的端口 81

由于服务端点地址必须是“完全限定”,要使服务能够找到其自定义绑定,必须更改单个服务器上的Services.config文件以反映“单服务器“vs”负载均衡服务器“端点连接,如下所示:

单服务器连接:

endpoint address="http://www.myserver.com:80/Services/MyService.svc"

加载平衡服务器连接:

endpoint address="http://www.myserver.com:81/Services/MyService.svc"

我的老板正确地早早诊断出核心问题,说服务器的行为就像自定义绑定被忽略,并且正在使用默认值。 在向您显示您的评论之后,您提到了“完全合格”服务端点地址的要求,他意识到主机文件重定向导致我们的浏览器请求转到单个服务器超过默认端口80,而不是负载平衡端口81,它实际上更改了完全限定的服务端点地址,导致服务器忽略自定义绑定并恢复为默认设置。 请注意,它无法调用该服务,它只能绑定自定义绑定!

希望下次我们使用自定义绑定生成测试服务时,有人会记住此帖子:)