wcf - máximo - maxreceivedmessagesize web service c#
La cuota máxima de tamaño de mensaje para los mensajes entrantes(65536)... Para aumentar la cuota, use la propiedad MaxReceivedMessageSize (3)
Tengo este loco problema con el que trato de lidiar. Sé que cuando obtenemos 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?
Funciona perfectamente normal cuando envío un parámetro de entrada de tamaño pequeño. Desafortunadamente, se rompe cuando la entrada crece.
Depurador dice:
Mala solicitud, 400;
en el archivo de seguimiento es:
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.
¿Hay alguna manera de aumentar esta cuota de datos entrantes en el lado del servidor? ¿si es así, cómo?
Aquí está mi muestra de configuración relacionada con partes:
<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 del lado del cliente (lo creo dinámicamente):
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();
Este problema se puede resolver agregando el siguiente nodo de enlace adicional 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>
Mi problema fue con el cliente de prueba wcf. Por alguna razón, no generaría una configuración de cliente con el aumento maxReceivedMessageSize. Mi solución fue hacer clic derecho en "Archivo de configuración" -> "Editar con SvcConfigEditor" -> enlaces -> maxReceivedMessageSize.
Puede establecer la propiedad MaxReceivedMessageSize
en el servicio a través del archivo de configuración del servicio.
La configuración del MaxReceivedMessageSize
del cliente solo afecta los mensajes recibidos por el cliente; no tiene efecto en los mensajes recibidos por el servicio. En consecuencia, para permitir que el servicio reciba mensajes grandes, debe configurar el archivo de configuración del servicio.
Ejemplo de configuración de servicio
<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 reducido, pero muestra las partes relevantes. La parte importante es que usted define el enlace y le asigna un nombre, establece valores explícitamente que son diferentes de los valores predeterminados y usa ese nombre en el atributo bindingConfiguration en el elemento de punto final.