Pregunta

Estoy teniendo un servicio WCF REST alojado en IIS utilizando .NET 4 RC. Este puesto requiere que el servicio se serializan con JSON. Todo funciona bien hasta que el tamaño de uno de los DataMember (cadena) es más largo que 8K. En este caso recibo el error se describe a continuación indicando la MaxStringContentLength se ha excedido. El atributo MaxStringContentLength para el punto final se ha incrementado y se lea correctamente desde el archivo de configuración.

config Web es:

<services>
  <service name="MyServiceServer" >
    <endpoint address="http://localhost/MyService" kind="webHttpEndpoint" endpointConfiguration="serviceEndPoint" contract="IMyService">
    </endpoint>
  </service>
</services>

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="serviceEndPoint" maxReceivedMessageSize="2048000"  maxBufferSize="2048000" maxBufferPoolSize="0">
      <readerQuotas maxStringContentLength="2048000" maxArrayLength="2048000"  maxDepth ="65000"/>
      <security mode="None">
        <transport clientCredentialType="None"/>
      </security>
    </standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>

interfaz IMyService se define como:

public interface IMyService
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/request", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    void MyMehod(<Class Type> obj);
}

Completo mensaje de error es:

“El servidor encontró un error al procesar la solicitud. El mensaje de excepción es 'Hubo un error deserializar el objeto de tipo. La cuota longitud del contenido máximo de cadena (8192) se ha superado durante la lectura de datos XML. Esta cuota se puede aumentar cambiando la propiedad MaxStringContentLength en los XmlDictionaryReaderQuotas objeto que se utiliza cuando se crea el lector XML. '. Ver los registros del servidor para obtener más detalles. El seguimiento de pila excepción es: en System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (lector de XmlReaderDelegator, Boolean verifyObjectName, DataContractResolver dataContractResolver) en System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject (lector XmlDictionaryReader, Boolean verifyObjectName) en System.ServiceModel. Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest (mensaje mensaje, objeto parámetros []) en System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (mensaje mensaje, Object [] parámetros) en System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (mensaje mensaje, Object [] parámetros) en System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs (MessageRpc y RPC) en System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc y RPC) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc y RPC) en System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc y RPC) en System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet)”

¿Fue útil?

Solución

Esto funciona, sólo asegúrese de tener una URL absoluta completa como su dirección de punto final. Si obtiene astuta e intenta utilizar una ruta relativa, o si se omite .svc que va a bombardear con el error de cuota lector extraño una vez que el pedido se hace demasiado grande -

Me gustaría presentar esta bajo un fallo de funcionamiento por WCF, ya sea porque:

  1. URL relativos deben reprobaron (y una excepción adecuada arrojados)

o

  1. la cuota lector debe trabajar con rutas relativas, así

Otros consejos

Insertar en tu web.config:

<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingConfig">
          <readerQuotas maxStringContentLength="2048000" />
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

y el inserto de atributos bindingConfiguration = "webHttpBindingConfig" en su punto final

He tenido problemas similares, pero con .NET 3.5

No he tenido problemas en el registro del servidor, por lo que el problema estaba en el cliente. Parece que la configuración con los valores máximos aumentó no fue leída y utilizada ...

Así que resolvió pasar el nombre del extremo explícitamente en el constructor de la WebChannelFactory, utilizando otro sobrecarga.

Antes:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>(new Uri(XXX));
factory.Credentials.UserName.UserName = K_USERNAME;
factory.Credentials.UserName.Password = K_PASSWORD;
IWKRestTest proxy = factory.CreateChannel();

es:

WebChannelFactory<IWKRestTest> factory = new WebChannelFactory<IWKRestTest>("IWKRestTestService");

y en el app.config que hay:

El Uri se indica en el nodo de punto final, pero allí también se encuentra el bindingConfiguration y así sucesivamente, por lo que todos los nuevos límites aumentados ahora funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top