wcf - maximum array length quota

Posted by dav.evans on Stack Overflow See other posts from Stack Overflow or by dav.evans
Published on 2009-01-21T10:19:21Z Indexed on 2010/04/12 18:13 UTC
Read the original article Hit count: 1126

Filed under:
|

Im writing a small wcf/wpf app to resize images but wcf is giving me grief when I try to send an image of size 28K to my service from the client. The service works fine when I send it smaller images. I immediately assumed that this was a configuration issue and I've trawled the web looking at posts regarding the MaxArrayLength property in my binding configuration. Ive upped the limits on these settings on both the client and server to the maximum 2147483647 but still 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://mywebsite.com/services/servicecontracts/2009/01:OriginalImage. The InnerException message was 'There was an error deserializing the object of type System.Drawing.Image. 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.'. Please see InnerException for more details."}

Ive made my client and server configs the same and they look like the following: Server:

<system.serviceModel>
	<bindings>
		<netTcpBinding>
			<binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
				<readerQuotas maxDepth="32"
							  maxStringContentLength="2147483647"
							  maxArrayLength="2147483647"
							  maxBytesPerRead="2147483647"
							  maxNameTableCharCount="2147483647" />
				<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
				<security mode="Transport">
					<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
					<message clientCredentialType="Windows" />
				</security>
			</binding>
		</netTcpBinding>
	</bindings>
	<behaviors>
		<serviceBehaviors>
			<behavior name="ServiceBehavior">
				<serviceMetadata httpGetEnabled="true" />
				<serviceDebug includeExceptionDetailInFaults="false" />
			</behavior>
		</serviceBehaviors>
	</behaviors>
	<services>
		<service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior">
			<host>
				<baseAddresses>
					<add baseAddress="http://localhost:900/mex/"/>
					<add baseAddress="net.tcp://localhost:9000/" />
				</baseAddresses>
			</host>
			<endpoint binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" />
			<endpoint  address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
		</service>
	</services>
</system.serviceModel>

and my client config looks like:

 <system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32" 
							  maxStringContentLength="2147483647"
							  maxArrayLength="2147483647" 
							  maxBytesPerRead="2147483647" 
							  maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
                <security mode="Transport">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://localhost:9000/" binding="netTcpBinding"
            bindingConfiguration="NetTcpBinding_ImageResizerServiceContract"
            contract="ImageResizerService.ImageResizerServiceContract"
            name="NetTcpBinding_ImageResizerServiceContract">
            <identity>
                <userPrincipalName value="[email protected]" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

It seems no matter what I set these values to I still get an error saying wcf cannot serialize my file because its greater than 16384. Any ideas?

edit: the email address in the userPrincipalName tag has been altered for my privacy

© Stack Overflow or respective owner

Related posts about wcf

Related posts about wcf-binding