Problem with large requests in WCF

2019-02-12 23:02发布

问题:

I've seen this problem posted a million times, but none of the solutions have worked for me...So here I go:

When calling a WCF service I get the following error:

The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://BlanketImportService.ServiceContracts/2011/06:request. The InnerException message was 'There was an error deserializing the object of type BlanketImport.BlanketImportRequest. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 1, position 44440.'. Please see InnerException for more details.

I have modified the readerQuotas on both the client server, AND applied the bindingConfiguration tag.

Here's the server config:

<bindings>
  <basicHttpBinding>
    <binding name="BilagImportBinding" maxBufferSize="2147483647"
      maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>

<services>
  <service name="BlanketImport">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BilagImportBinding" bindingNamespace="http://BlanketImportService.ServiceContracts/2011/06" contract="BlanketImport.IBlanketImport">
    </endpoint>
  </service>
</services>

And the client config:

  <bindings>
    <basicHttpBinding>
      <binding name="BilagImportBinding" maxBufferSize="2147483647"
        maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
          maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint address="http://localhost/BlanketImport/BlanketService.svc"
      binding="basicHttpBinding" bindingConfiguration="BilagImportBinding" contract="BlanketServiceReference.IBlanketService"
      name="BasicHttpBinding_IBlanketService" />
  </client>

回答1:

Found the solution...But still very strange!

If I remove the name attribute from my binding tag and the bindingConfiguration attribute from my endpoint tag it all works. This means that the basicHttpBinding configuration is the default configuration for all basicHttpBinding endpoints



回答2:

I had the same problem whilst trying to upload files using WCF using a named binding configuration. This has to do with the changes in WCF 4.0 and "Simplified" Configuration (see MSDN)

FYI: I tried everything to solve this problem; the parameter to the service was a byte array, so we removed it and used a stream, tried changing buffered versus streaming mode and obviously the 1.5 million config options to change sizes that never got picked up with a named config.

Very strange indeed, but working with your suggestion.



回答3:

I had a similar issue where the named binding wasn't used by the endpoint. My problem was a typo in the service name. Like Livewire said, WCF 4 Simplified Configuration automatically creates a endpoint and my defined endpoint was not overwriting it.