superó máxima matriz los longitud leer datos cuota contenido cadena .net asp.net wcf .net-3.5

.net - máxima - WCF-Cómo aumentar la cuota de tamaño del mensaje



se superó la cuota de longitud del contenido de cadena 8192 al leer los datos xml (13)

El cliente de prueba de WCF tiene su propia configuración de cliente.

Ejecute el cliente de prueba y desplácese hasta el final Si hace doble clic en el nodo Archivo de configuración, verá la representación XML. Como se puede ver, maxReceivedMessageSize es 65536 .

Para editar esto, haga clic con el SvcConfigEditor derecho en el nodo del árbol de archivo de configuración y seleccione Editar con SvcConfigEditor . Cuando se abra el editor, expanda Enlaces y haga doble clic en el enlace que se generó automáticamente.

Puede editar todas las propiedades aquí, incluido maxReceivedMessageSize . Cuando haya terminado, haga clic en Archivo - Guardar .

Por último, cuando vuelva a la ventana del cliente de prueba de WCF, haga clic en Herramientas - Opciones .

NOTA : Desmarque la configuración Siempre regenerar al iniciar servicios .

Tengo un servicio WCF que devuelve 1000 registros de la base de datos al cliente. Tengo un cliente de WCF de ASP.NET (he agregado una referencia de servicio en el proyecto de aplicación web de asp.net para consumir WCF).

Recibo el siguiente mensaje cuando ejecuto la aplicación cliente:

Se ha superado 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.

¿Alguna ayuda? ¿Cómo aumentar la cuota de tamaño del mensaje?


Encontré el camino fácil

--- haga clic con el botón derecho en el archivo de configuración de la aplicación o webconfig y haga clic en EDITAR CONFIGURACIÓN WCF y acceda a bingdigs y seleccione el servicio de antaño y, a la derecha, muestre un gran número maxReciveMessageSize d


No olvide que se considerará el archivo app.config del punto de entrada de ejecución, no el proyecto de la biblioteca de clases que administra las llamadas al Servicio Web, si es que existe.

Por ejemplo, si obtiene el error mientras ejecuta la prueba de la unidad, necesita configurar la configuración apropiada en el proyecto de prueba.


Para HTTP:

<bindings> <basicHttpBinding> <binding name="basicHttp" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000"> <readerQuotas maxDepth="200" maxArrayLength="200000000" maxBytesPerRead="4096" maxStringContentLength="200000000" maxNameTableCharCount="16384"/> </binding> </basicHttpBinding> </bindings>

Para TCP:

<bindings> <netTcpBinding> <binding name="tcpBinding" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000"> <readerQuotas maxDepth="200" maxArrayLength="200000000" maxStringContentLength="200000000" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> </binding> </netTcpBinding> </bindings>

IMPORTANTE:

Si intenta pasar un objeto complejo que tiene muchos objetos conectados (por ejemplo: una estructura de datos de árbol, una lista que tiene muchos objetos ...), la comunicación fallará sin importar cómo haya aumentado las Cuotas. En tales casos, debe aumentar el número de objetos que contienen:

<behaviors> <serviceBehaviors> <behavior name="NewBehavior"> ... <dataContractSerializer maxItemsInObjectGraph="2147483646"/> </behavior> </serviceBehaviors> </behaviors>


Para mí, todo lo que tenía que hacer es agregar maxReceivedMessageSize="2147483647" al cliente app.config. El servidor quedó intacto.


Recibí este error cuando uso esta configuración en web.config

System.ServiceModel.ServiceActivationException

Establecí configuraciones como esta:

<service name="idst.Controllers.wcf.Service_Talks"> <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior" binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" /> </service> <service name="idst.Controllers.wcf.Service_Project"> <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior" binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp" contract="idst.Controllers.wcf.Service_Project" /> </service> </services> <bindings> <basicHttpBinding> <binding name="largBasicHttp" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000"> <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/> </binding> </basicHttpBinding>


Resolví mi problema en Bing Maps WPF en mi proyecto usando CalculateRoute (). La solución en mi caso fue establecer maxReceivedMessageSize y maxReceivedMessageSize en el atributo "httpTransport" para la sección "customBinding".

Establecí en el archivo applications.config (es. MyApp.config) esta configuración:

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IGeocodeService" /> <binding name="BasicHttpBinding_IRouteService" /> </basicHttpBinding> <customBinding> <binding name="CustomBinding_IGeocodeService"> <binaryMessageEncoding /> <httpTransport manualAddressing="false" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" /> </binding> <binding name="CustomBinding_IRouteService"> <binaryMessageEncoding /> <httpTransport manualAddressing="false" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" /> </binding> </customBinding> </bindings> <client> <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService" contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" /> <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp" binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService" contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" /> <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService" contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" /> <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp" binding="customBinding" bindingConfiguration="CustomBinding_IRouteService" contract="BingServices.IRouteService" name="CustomBinding_IRouteService" /> </client> </system.serviceModel>


Resuelvo el problema ... como sigue

<bindings> <netTcpBinding> <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" portSharingEnabled="true"> <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647" maxDepth="2147483647" maxBytesPerRead="2147483647" /> <security mode="None" /> </binding> </netTcpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="ECMSServiceBehavior"> <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" /> <serviceDebug includeExceptionDetailInFaults="true" /> <serviceTimeouts transactionTimeout="00:10:00" /> <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100" maxConcurrentInstances="100" /> </behavior> </serviceBehaviors> </behaviors>


Si aún recibe este mensaje de error mientras usa el cliente de prueba de WCF, es porque el cliente tiene una configuración de MaxBufferSize separada.

Para corregir el problema:

  1. Haga clic con el botón derecho en el nodo Archivo de configuración en la parte inferior del árbol
  2. Seleccione Editar con SvcConfigEditor

Aparecerá una lista de configuraciones editables, incluido MaxBufferSize.

Nota: los clientes proxy generados automáticamente también configuran MaxBufferSize a 65536 de forma predeterminada.


Si está creando dinámicamente sus enlaces WCF, aquí tiene el código que debe utilizar:

BasicHttpBinding httpBinding = new BasicHttpBinding(); httpBinding.MaxReceivedMessageSize = Int32.MaxValue; httpBinding.MaxBufferSize = Int32.MaxValue; // Commented next statement since it is not required // httpBinding.MaxBufferPoolSize = Int32.MaxValue;


Querrá algo como esto para aumentar las cuotas de tamaño del mensaje, en el archivo App.config o Web.config :

<bindings> <basicHttpBinding> <binding name="basicHttp" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000"> <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/> </binding> </basicHttpBinding> </bindings>

Y use el nombre de enlace en su configuración de punto final, por ejemplo

... bindingConfiguration="basicHttp" ...

La justificación de los valores es simple, son lo suficientemente grandes para acomodar la mayoría de los mensajes. Puedes ajustar ese número para que se ajuste a tus necesidades. El bajo valor predeterminado está básicamente allí para evitar ataques de tipo DOS. Hacerlo 20000000 permitiría que un ataque distribuido de DOS sea efectivo, el tamaño predeterminado de 64k requeriría un gran número de clientes para dominar la mayoría de los servidores en estos días.


Otra cosa importante a considerar desde mi experiencia ..

Recomiendo encarecidamente que NO maximice maxBufferPoolSize, ya que los buffers de la agrupación nunca se liberan hasta que el dominio de la aplicación (es decir, la agrupación de aplicaciones) se recicle.

Un período de alto tráfico podría causar que se use mucha memoria y nunca se libere.

Más detalles aquí:


<bindings> <wsHttpBinding> <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000" maxBufferPoolSize="20000000"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" establishSecurityContext="false"/> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Username" contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType" name="ServicesFacadeEndpoint" /> </client>