2011-12-05 71 views
16

Tengo este problema loco que estoy tratando de resolver. Sé que cuando estamos obteniendo una gran cantidad de datos debemos aumentar la cuota en el archivo .config del cliente, pero ¿qué se supone que debo hacer si mi cliente está enviando datos enormes "al" servidor WCF?La cuota máxima de tamaño de mensaje para los mensajes entrantes (65536) ... Para aumentar la cuota, use la propiedad MaxReceivedMessageSize

Funciona perfectamente normal cuando envío parámetros de entrada de tamaño pequeño. Desafortunadamente, se descompone cuando la información crece.

depurador que dice:

Solicitud incorrecta, 400;

el archivo de seguimiento es: se ha excedido

La cuota máxima de tamaño de mensaje para los mensajes entrantes (65536) . Para aumentar la cuota, use la propiedad MaxReceivedMessageSize en el elemento de enlace apropiado.

¿Hay alguna manera de aumentar esta cuota de datos entrantes en el servidor? ¿si es así, cómo?

partes Aquí está relacionada Las muestras de configuración:

<bindings> 
    <basicHttpBinding> 
    <binding name="MyBasicHttpBinding" 
     closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" 
     sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" 
     hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" 
     maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 

    </basicHttpBinding> 
</bindings> 

<services> 
    <service name="MyWcfService"> 
    <endpoint address="http://myservice..." 
     binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding" 
     name="MyBasicHttpBinding" contract="IMyContract" /> 
    </service> 
</services> 

y aquí está mi código de cliente (creo que de forma dinámica):

 var binding = new BasicHttpBinding(); 
     binding.MaxBufferPoolSize = 2147483647; 
     binding.MaxBufferSize = 2147483647; 
     binding.MaxReceivedMessageSize = 2147483647; 
     binding.ReaderQuotas.MaxStringContentLength = 2147483647; 
     binding.ReaderQuotas.MaxArrayLength = 2147483647; 
     binding.ReaderQuotas.MaxDepth = 2147483647; 
     binding.ReaderQuotas.MaxBytesPerRead = 2147483647; 


     var address = new EndpointAddress("http://mylocalservice.."); 

     ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address); 

     foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
     { 
      DataContractSerializerOperationBehavior dataContractBehavior = 
         op.Behaviors.Find<DataContractSerializerOperationBehavior>() 
         as DataContractSerializerOperationBehavior; 
      if (dataContractBehavior != null) 
      { 
       dataContractBehavior.MaxItemsInObjectGraph = 2147483646; 
      } 
     } 
     public IMyContract MyClientObject = factory.CreateChannel(); 
+0

He resuelto el problema por el paso mencionado [aquí] [1] [1]: http: // stackoverflow.com/questions/7476853/wcf-error-maximum-number-of-items-that-can-be-serialized-or-deserialized-in-an/8656402 # 8656402 – Ram

+1

En el código del lado del cliente está configurando las cuotas de lector mediante código entonces el siguiente es el enfoque para configurarlos: XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); myReaderQuotas.MaxStringContentLength = 2147483647; myReaderQuotas.MaxArrayLength = 2147483647; myReaderQuotas.MaxBytesPerRead = 2147483647; myReaderQuotas.MaxDepth = 64; myReaderQuotas.MaxNameTableCharCount = 2147483647; binding.GetType(). GetProperty ("ReaderQuotas"). SetValue (binding, myReaderQuotas, null); – Rajesh

Respuesta

36

Usted puede establecer la propiedad MaxReceivedMessageSize en el servicio a través de la archivo de configuración del servicio.

Configurar el cliente MaxReceivedMessageSize solo afecta los mensajes recibidos por el cliente; no tiene ningún efecto en los mensajes recibidos por el servicio. En consecuencia, para permitir que el servicio reciba mensajes grandes, debe establecer el archivo de configuración del servicio.

de servicio de ejemplo de configuración

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="MyBinding" maxReceivedMessageSize="2147483647" /> 
    </wsHttpBinding> 
    </bindings> 
    <services> 
    <service name="MyService"> 
     <endpoint address="http://myservice" binding="wsHttpBinding" 
       bindingConfiguration="MyBinding" contract="IMyServiceContract" /> 
    </service> 
    </services> 
</system.serviceModel> 

Lo anterior es un archivo de configuración muy simplificada, pero muestra las partes pertinentes. La parte importante es que defina el enlace y le dé un nombre, y establezca los valores explícitamente que sean diferentes de los valores predeterminados, y use ese nombre en el atributo bindingConfiguration en el elemento del punto final.

+0

Lo que pasa es que no veo ninguna configuración vinculante en el lado del servidor. ¿hay algún enlace predeterminado o algo así? ¿Cómo puedo anularlo? –

+1

Sí, lo hay. Si no tiene una sección de enlace específica en su archivo de configuración y no está referenciada en el elemento '' a través del atributo bindingConfiguration, se usarán los valores predeterminados para el enlace (que es 65536 para la propiedad MaxReceivedMessageSize). Por lo tanto, deberá agregar la sección correspondiente ' 'a la configuración. – Tim

+0

¿hay algún tipo de ejemplo de enlace del servidor y/o configuración del punto final? Ya estoy atrapado en ese punto. –

5

Este problema se puede resolver agregando el nodo de enlace adicional a continuación a la sección de enlace del archivo de configuración.

<basicHttpBinding> 
    <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> 
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    </binding> 
</basicHttpBinding> 
+3

Bienvenido a StackOverflow. El OP tiene un código muy similar en su configuración. ¿De qué manera tu respuesta es mejor que la que tenían? Puede mejorar su respuesta explicando la respuesta que no hicieron antes. – carlosfigueira

6

Mi problema fue con el cliente de prueba wcf. Por alguna razón, no generaría una configuración de cliente con el maxReceivedMessageSize incrementado. Mi solución fue hacer clic derecho en "Config file" -> "Edit with SvcConfigEditor" -> bindings -> maxReceivedMessageSize.

+0

en la mayoría de las respuestas muestran cómo establecer estas configuraciones en el servidor. pero si sigue siendo un error, como mencionaste, también deberíamos configurar estos ajustes en el cliente. en mi caso, el app.config de la aplicación que consume el servicio web primera era la siguiente: he modificado como esto (véase la parte 2): – mihai71

+0

... parte 2: y funcionó bien. – mihai71

Cuestiones relacionadas