由于maxReceivedMessageSize仍为65536,因此可怕的WCF BAD请求400

Val*_*zub 6 wcf http-status-code-400

上帝,你不喜欢WCF.

我读了所有可能的线程,但我现在真的被卡住了.

这是WCF配置:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="BaseHttp" 
                  maxBufferSize="4194304" 
                  maxBufferPoolSize="4194304" 
                  maxReceivedMessageSize="4194304"  />
      </basicHttpBinding>
   </bindings>
   <behaviors>
      <serviceBehaviors>
         <behavior name="TaskServiceBehavior">
            <serviceMetadata httpGetEnabled="True" />
            <serviceDebug includeExceptionDetailInFaults="True" />
         </behavior>
         <behavior name="">
            <serviceMetadata httpGetEnabled="true" />
         </behavior>
      </serviceBehaviors>
   </behaviors>
   <services>
      <service behaviorConfiguration="TaskServiceBehavior" name="TaskService">
         <endpoint 
             address="http://www.mysite.com/TableTaskService/TableTaskService.svc" 
             binding="basicHttpBinding" bindingConfiguration="BaseHttp" 
             contract="TableTaskService.ITableTaskService" />
         <endpoint 
             address="mex" 
             binding="mexHttpBinding"  
             contract="IMetadataExchange" />
         <host>
            <baseAddresses>
               <add baseAddress="http://www.mysite.com/TableTaskService/" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
         <add prefix="http://www.mysite.com/" />
      </baseAddressPrefixFilters>
   </serviceHostingEnvironment>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

现在我发送一条消息并抛出这个默认异常(在svclog文件中看到):

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

现在我清楚地说它应该是4mb.

我的客户代码:

TableTaskServiceClient client = 
    new TableTaskServiceClient(
          new BasicHttpBinding { MaxBufferSize = 4194304, 
                                 MaxReceivedMessageSize = 4194304 }, 
          new EndpointAddress(GetEndpointAddressString())
    );
Run Code Online (Sandbox Code Playgroud)

然而它会给我造成这个65536大小的错误.它来自哪里??

客户端设置MaxReceivedMessageSize与服务器相同的值是否真的很重要?我认为服务器负责确定长度而不是客户端是合乎逻辑的.

还有这个警告(请注意它的含义是多么有用,即:没有关于被覆盖的元素的信息或者我错过了什么信息),也许basichttpbinding正是被覆盖的东西?但为什么会这样呢?无论如何:

[TraceRecord]严重性警告TraceIdentifier http://msdn.microsoft.com/en-US/library/System.ServiceModel.OverridingDuplicateConfigurationKey.aspx 描述配置系统在不同的配置范围内检测到重复的密钥,并覆盖最近的密钥值.AppDomain/LM/W3SVC/11/ROOT/TableTaskService-33-1296567源System.ServiceModel.Configuration.ServiceBehaviorElementCollection/-851144413 ElementName behavior OldElementLineNumber 0 NewElementLineNumber 0

UPDTE:重新配置服务和客户端:

TableTaskServiceClient client = new TableTaskServiceClient(
                        new BasicHttpBinding { 
                            MaxBufferSize = 4194304, 
                            MaxReceivedMessageSize = 4194304,
                            MaxBufferPoolSize=4194304,
                            ReaderQuotas = new XmlDictionaryReaderQuotas
                                               {
                                                   MaxArrayLength = 4194304, 
                                                   MaxBytesPerRead = 4194304, 
                                                   MaxDepth = 4194304, 
                                                   MaxNameTableCharCount = 4194304,
                                                   MaxStringContentLength = 4194304
                                               }
                        }, new EndpointAddress(GetEndpointAddressString()));
Run Code Online (Sandbox Code Playgroud)

同样的错误.

如果这是有意义的,我发送一个长度为467000的byte []数组

Mer*_*ham 1

尝试这个:

<basicHttpBinding>
  <binding name="BaseHttp"
           maxBufferSize="4194304"
           maxBufferPoolSize="4194304"
           maxReceivedMessageSize="4194304">
    <readerQuotas maxArrayLength="4194304"
                  maxBytesPerRead="4194304"
                  maxDepth="4194304"
                  maxNameTableCharCount="4194304"
                  maxStringContentLength="4194304"
                  />
  </binding>
</basicHttpBinding>
Run Code Online (Sandbox Code Playgroud)

尽管其中一些设置没有意义,但我只是将它们设置为一个较大的值。

另外,一旦您开始工作,我强烈建议您减少这些值,因为它们的存在是为了防止对您的网站进行DoS 攻击。