Pregunta

Ahora he investigado los 400 BadRequest código para las dos últimas horas.Un montón de sugerencias va a garantizar el bindingConfiguration atributo se establece correctamente, y en mi caso es así.

Ahora, necesito TU ayuda antes de destruir el edificio estoy :-)

Tengo un WCF RestFull servicio (muy ligero, el uso de este recurso para la inspiración: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx) que (por ahora) acepta un XmlElement (VARICELA) proporcionados a través del verbo POST.

Actualmente estoy usando SÓLO el Violinista solicitud del generador antes de la implementación de un verdadero cliente (como este se entornos mixtos).

Cuando hago esto para XML menor que 65K, funciona bien mayor, se lanza esta excepción:El tamaño máximo de mensaje de cuota para los mensajes entrantes (65536) ha sido superado.Para aumentar la cuota, el uso de la MaxReceivedMessageSize de la propiedad en el correspondiente elemento de enlace.

Aquí está mi web.archivo de configuración (que yo incluso incluyó al cliente-etiqueta (en tiempos desesperados!)):

<system.web>
    <httpRuntime maxRequestLength="1500000" executionTimeout="180"/>
  </system.web>
  <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxReceivedMessageSize="1500000" maxBufferPoolSize="1500000" maxBufferSize="1500000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="1500000" maxArrayLength="1500000" maxBytesPerRead="1500000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <client>
      <endpoint address="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding" contract="Commerce.ICatalogue"/>
    </client>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="Catalogue">
        <endpoint address="" 
                  behaviorConfiguration="RestFull" 
                  binding="webHttpBinding"
                  bindingConfiguration="WebHttpBinding" 
                  contract="Commerce.ICatalogue" />
        <!-- endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" / -->
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestFull">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Gracias de antemano por cualquier ayuda que conduce al éxito de la llamada con >65 MIL XML ;-)

¿Fue útil?

Solución

Bien, esto realmente me causó un duro tiempo en la resolución, la que será repuesto a otros para.El reto consistía en el hecho, que he utilizado el <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>, que es un bonito y fácil de fábrica enfoque de implementación.

Sin embargo, este enfoque tiene inconvenientes;ya no se necesita ninguna configuración en el web.archivo de configuración, el WebServiceHostFactory clase por el diseño no se ha leído de la web.archivo de configuración.Lo sé;Yo podría heredar de esta clase, y hacer los cambios apropiados por lo que de hecho puede leer desde el archivo de configuración, pero esto me pareció un poco fuera de alcance.

Mi solución fue volver a la manera más tradicional de la implementación de la WCF; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>, y , a continuación, utilizar mi ya los valores configurados en la web.archivo de configuración.

Aquí está mi web modificada.archivo de configuración (con respecto a Maddox dolor de cabeza):

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="XmlMessageBinding" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
          <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" />
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="fullyQualifiedClassName" behaviorConfiguration="DevelopmentBehavior">
        <endpoint name="REST" address="" binding="webHttpBinding" contract="fullyQualifiedInterfaceName" behaviorConfiguration="RestEndpointBehavior" bindingConfiguration="XmlMessageBinding" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="RestEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="DevelopmentBehavior">
          <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
        <behavior name="ProductionBehavior">
          <serviceDebug httpHelpPageEnabled="false" includeExceptionDetailInFaults="false"/>
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Otra ventaja de este cambio es que ahora se puede hacer referencia a la WCF-resto de servicios directamente desde .NET;esto no puede ser hecho usando el modelo de Fábrica y la implementación de mi XmlElement a través de la solución.

Espero que esto pueda ayudar a otros con problemas similares ...

Otros consejos

Sé que esta es una pregunta muy antigua y ya tiene una respuesta ...

De todos modos ...

Lo que hice para resolver este " problema " Creé una Factory heredada de WebServiceHostFactory y creé un Host de servicio personalizado heredado de WebServiceHost

Y en el host anulé el método OnOpening como este

protected override void OnOpening()
        {
            base.OnOpening();

            foreach (var endpoint in Description.Endpoints)
            {
                var binding = endpoint.Binding as System.ServiceModel.Channels.CustomBinding;

                foreach (var element in binding.Elements)
                {
                    var httpElement = element as System.ServiceModel.Channels.HttpTransportBindingElement;
                    if (httpElement != null)
                    {
                        httpElement.MaxBufferSize = 2147483647;
                        httpElement.MaxReceivedMessageSize = 2147483647;
                    }
                }
            }

        }

Creo que tuve el mismo problema, pero cuando configuré el enlace predeterminado para webHttp, funcionó:

<bindings>
        <webHttpBinding>
            <binding maxReceivedMessageSize="2000000"
                      maxBufferSize="2000000">
                <readerQuotas maxStringContentLength="2000000"/>
            </binding>
        </webHttpBinding>
    </bindings>

Observar: sin nombre en el enlace.

Esta es una entrada de blog que escribí que reproduce este problema con un servidor WCF y una pieza de cliente absolutamente mínimos:

WCF - Fijación de la longitud de la cadena lateral del cliente excepciones

En particular, es posible que necesite una configuración de enlace personalizada. Al menos reproducir esta muestra puede darle algunas ideas para su situación particular.

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