views:

3139

answers:

3

I have a the following server side app.config for a WCF service:

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="default" maxReceivedMessageSize="5000000">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Core.TOAService.Service1Behavior"
        name="Core.TOAService.TOAService">
        <endpoint address="" binding="wsHttpBinding" contract="Core.TOAService.ITOAService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/Core.TOAService/TOAService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Core.TOAService.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

When I try and pass this service a largish file (only ~250KB), I get an exception logged in the svclog file:

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.

As you can see from the binding section at the top of the config, I have tried to set the maxReceivedMessageSize to 5000000 but the service still thinks it is set to the default 65536. Any ideas as to what is wrong or which is the "appropriate" binding element?

+8  A: 

There's more settings :-) Try "maxBufferPoolSize" and "maxBufferSize" on the <binding> tag.

But the biggest problem is: your endpoint does not reference that binding configuration!

<endpoint address="" 
          binding="wsHttpBinding" contract="Core.TOAService.ITOAService">

You need to add a reference to it so that it gets useful - just calling it "default" doesn't work.....

<endpoint address="" 
          binding="wsHttpBinding" 
          bindingConfiguration="default"
          contract="Core.TOAService.ITOAService">

You're ahead of your times ;-) In WCF 4 (with .NET 4.0 - sometime later this year 2009), you'll be able to define "default binding configurations" without having to explicitly name and reference them - but for now, you need to create a link between your endpoint and its binding and any binding (or behavior) configuration you have!

Marc

marc_s
Yes, you have to reference the binding config.The buffer changes are probably not necessary.
Oplopanax
It's never quite clear if and which of the three buffer changes are really needed - it helps to try, and see. There's really no good, comprehensive documentation and explanation as to how to tweak those settings, unfortunately....
marc_s
Doh, servers me right for using VS2010 to build a 3.5 service! Many thanks, that's fixed it.
Colin Desmond
+1  A: 

There are several places that you need to set the size. In your case I think that you need to add read quotas. Here is an example:

  <basicHttpBinding>
    <binding name="httpBasicBinding_Service" closeTimeout="00:03:00"
      openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"
      maxBufferSize="2000001"
      maxBufferPoolSize="2000001" maxReceivedMessageSize="2000001">
      <readerQuotas maxDepth="2000001" maxStringContentLength="2000001"
        maxArrayLength="2000001" maxBytesPerRead="2000001" maxNameTableCharCount="2000001" />
    </binding>
  </basicHttpBinding>
Shiraz Bhaiji
+1  A: 

If you're still getting this error message while using the WCF Test Client, it's because it has it's own MaxBufferSize setting. Right-Click on the Config File node at the bottom of the tree and select Edit with SvcConfigEditor.

A list of editable settings will appear, including MaxBufferSize.

Michael Rodrigues