Search code examples
c#wcfsvcutil.exe

Status code 413 (RequestEntityTooLarge) / Status code 415 (UnsupportedMediaType). WCF Programmatically


I am calling a WCF web service programmatically by generating class files through SvcUtil.exe.

All working fine but when I try to send an image (literally a file with size more than 200KB), I get this error.

I know I need to increase maxReceivedMessageSize and maxBufferPoolSize to the maximum to send large files to the WCF service. Hence, the XML version of doing this will be like below:

<binding name="SampleBinding" allowCookies="true" messageEncoding="Mtom" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
  <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
  <security mode="None">
    <transport proxyCredentialType="Basic"/>
  </security>
</binding>

In this app, since I am using class files generated by SvcUtil, I need to call my WCF service method programmatically.

So I did,

var binding = new BasicHttpBinding();
binding.MaxReceivedMessageSize = binding.MaxBufferPoolSize = long.MaxValue;
binding.AllowCookies = true;
binding.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
binding.ReaderQuotas.MaxArrayLength = binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;

webAPI = new WebAPIClient(binding, new EndpointAddress(soapUrl));

The XML version works really well but the C# version failed with below stack trace:

There was an error on processing web request: Status code 413(RequestEntityTooLarge): Request Entity Too Large

EDIT

I have been approached to use custom binding. Below is my custom binding code:

CustomBinding binding = new CustomBinding()
{
    Name = "SampleBinding",
    ReceiveTimeout = new TimeSpan(0, 0, 10, 0, 0),
    SendTimeout = new TimeSpan(0, 0, 10, 0, 0),
};
var element1 = new TextMessageEncodingBindingElement()
{
    ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
    {
        MaxDepth = 2147483647,
        MaxStringContentLength = 2147483647,
        MaxArrayLength = 2147483647,
        MaxBytesPerRead = 2147483647,
        MaxNameTableCharCount = 2147483647
    }
};
var element2 = new HttpTransportBindingElement()
{
    ManualAddressing = false,
    MaxReceivedMessageSize = 2147483647,
    AllowCookies = false,
    AuthenticationScheme = System.Net.AuthenticationSchemes.None,
    BypassProxyOnLocal = false,
    MaxBufferSize = 2147483647,
    ProxyAuthenticationScheme = System.Net.AuthenticationSchemes.None,
    TransferMode = TransferMode.Buffered,
    UseDefaultWebProxy = true
};
var element3 = new TextMessageEncodingBindingElement(MessageVersion.Soap12WSAddressing10, System.Text.Encoding.UTF8);

binding.Elements.Add(element1);
binding.Elements.Add(element2);
binding.Elements.Add(element3);

webAPI = new WebAPIClient(binding, new EndpointAddress(soapUrl));

There was an error on processing web request: Status code 415(UnsupportedMediaType): Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.

I don't know what's wrong. May you help me?


Solution

  • I just found an answer and posting the same here for future users who might have the same issue as me:

    My client call

    webAPI = new WebAPIClient(new BasicHttpBinding(), new EndpointAddress(_urlString);
    

    Server Configuration for the WCF Service

    <endpoint address="url/WebAPI.svc" binding="basicHttpBinding" contract="MyContract.IWebAPI" />
    
    <bindings>
      <basicHttpBinding>
        <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text">
          <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>
      </basicHttpBinding>
    </bindings>
    

    As you can see I did not mention any name for the binding configuration here and it just worked like a charm.

    Answer inspired from this SO answer