Search code examples
wcfwcf-binding

WCF - Return large data set to Client


The goal is to send the contents of a table as a data set to the client. I get an error from the client application:

"The maximum message size quota for incoming messages (65536) has been exceeded."

Although in the same WCF application retrieving large data amount from the client there is no error. Please see the config file.

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>

<bindings>
  <wsHttpBinding>
    <binding name="TeansferBinding" 
             messageEncoding="Mtom" 
             maxBufferPoolSize="2147483647" 
             maxReceivedMessageSize="2147483647" 
             receiveTimeout="00:10:00">
      <readerQuotas maxDepth="2147483647" 
                    maxStringContentLength="2147483647" 
                    maxArrayLength="2147483647"/>
      <!-- 
        For forced HTTPS
        change the security mode from None to Transport and add Transport key with clientCredentialType="None"
        <security mode="Transport">
          <transport clientCredentialType="None"/>
        </security
      -->
      <security mode="None" />
    </binding>
    <binding name="ProjectBinding"
             messageEncoding="Text"
             maxBufferPoolSize="2147483647"
             maxReceivedMessageSize="2147483647"
             receiveTimeout="00:10:00">
      <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"/>
      <!-- 
        For forced HTTPS
        change the security mode from None to Transport and add Transport key with clientCredentialType="None"
        <security mode="Transport">
          <transport clientCredentialType="None"/>
        </security
      -->
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>

    <behavior name="TransferBehavior">
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
      <!-- 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"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500"/>
    </behavior>

  </serviceBehaviors>
</behaviors>

<services>

  <service behaviorConfiguration="TransferBehavior" name="TransferServer.Restore" >
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="TeansferBinding" 
              contract="TransferServer.IRestore"/>
    <!-- remove mex endpoint of production server -->
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              name="Mex" 
              contract="IMetadataExchange"/>
    <host>
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00"/>
    </host>
  </service>

  <service behaviorConfiguration="TransferBehavior" name="TransferServer.ProjectProvider">
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="ProjectBinding" 
              contract="TransferServer.IProjectProvider"/>
    <!-- remove mex endpoint of production server -->
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              name="Mex" 
              contract="IMetadataExchange"/>
    <host>
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00"/>
    </host>
  </service>

</services>

I've searched for a solution but only come back to the adjustment of the config file. The WCF application is not reporting any error and the client is reporting the error.

I've tried using wsHttpBinding and basicHttpBinding with no success. I've tried MTOM and Text message encoding.


@Abraham Qian

App Config File for Client

Here is the App.Config file for the client.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IRestore" messageEncoding="Mtom">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                    </security>
                </binding>
                <binding name="WSHttpBinding_IProjectProvider">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://myServer.com/Restore.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IRestore"
                contract="RestoreProvider.IRestore" name="WSHttpBinding_IRestore" />
            <endpoint address="https://myServer.com/ProjectProvider.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IProjectProvider"
                contract="ProjectProvider.IProjectProvider" name="WSHttpBinding_IProjectProvider" />
        </client>
    </system.serviceModel>
</configuration>

As for the binding information for the ProjectProvider service the only difference is "maxBufferSize" which when inserted creates an error.

Usage code in the Client

Public sub GetZips()
    'Get the information from Ops
    Using oProjectProvider As New ProjectProvider.ProjectProviderClient
        MyDataSet = oProjectProvider.GetZipCodeData
        oProjectProvider.Close()
    End Using
    Application.DoEvents()
End sub

Solution

  • I would like to know the client configuration. how do you create a call to the service? We had better apply the configuration on both the client-side and the server-side. Besides, I suspect there is something wrong with the client service endpoint address. Please post the complete client configuration.
    In addition, please refer to the below configuration.

    <binding maxBufferPoolSize="2147483647" 
             maxReceivedMessageSize="2147483647">
        <readerQuotas maxDepth="2147483647" 
                      maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647" 
                      maxBytesPerRead="2147483647"
                      maxNameTableCharCount="2147483647" />
    </binding>
    

    Feel free to let me know if the problem still exists.