Search code examples
wcfwcf-bindingservicebus

WCF NetMessagingBinding and Outgoing Quotas


I'm trying to use WCF and NetMessagingBinding to publish messages into a Windows Service Service Bus Topic and for large messages - at least 603kb - the push operation is throwing the following error:

System.ServiceModel.QuotaExceededException: The maximum message size quota for outgoing messages (262144) has been exceeded.

Server stack trace: 
   at System.Runtime.BufferedOutputStream.WriteCore(Byte[] buffer, Int32 offset, Int32 size)
   at System.Xml.XmlBinaryNodeWriter.FlushBuffer()
   at System.Xml.XmlStreamNodeWriter.GetBuffer(Int32 count, Int32& offset)
   at System.Xml.XmlStreamNodeWriter.UnsafeWriteUTF8Chars(Char* chars, Int32 charCount)
   at System.Xml.XmlBinaryNodeWriter.UnsafeWriteText(Char* chars, Int32 charCount)
   at System.Xml.XmlBinaryNodeWriter.WriteText(String value)
   at System.Xml.XmlBaseWriter.WriteString(String value)
   (...)

From the error I noticed that the problem is not the serialization and therefore I can't use a Message Formatter. What else can I use to overcome this exception? Any thoughts?

Thanks in advance!


Solution

  • This issue was solved by replacing the netMessagingBinding by a customBinding which uses the netMessagingTransport.

    1- Add netMessagingTransport as a binding extension:

       <bindingElementExtensions>
        <add name="netMessagingTransport" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingTransportExtensionElement, Microsoft.ServiceBus, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingElementExtensions>
    

    2- Add a custom binding:

    <customBinding>
        <binding name="sbBindingConfiguration" sendTimeout="00:01:00" receiveTimeout="00:01:00" openTimeout="00:01:00">
          <binaryMessageEncoding>
                  <readerQuotas maxDepth="100000000" maxStringContentLength="100000000" 
                        maxArrayLength="100000000" maxBytesPerRead="100000000" maxNameTableCharCount="100000000"/>
         </binaryMessageEncoding>
          <netMessagingTransport  manualAddressing="false" maxBufferPoolSize="100000" maxReceivedMessageSize="100000000">
            <transportSettings batchFlushInterval="00:00:00"/>
          </netMessagingTransport>
        </binding>
      </customBinding>
    

    3- Use the attribute maxReceivedMessageSize to define a value that suits the size of messages that will be exchanged

    4- Reference your custom binding in the endpoint

    <endpoint (...) binding="customBinding" bindingConfiguration="sbBindingConfiguration" />