Pergunta

Eu já investigou a 400 - Código BadRequest para as últimas duas horas. Um monte de sugestões vai no sentido de assegurar o atributo bindingConfiguration está configurado corretamente, e no meu caso, é.

Agora, eu preciso de sua ajuda antes de destruir o prédio que eu estou em: -)

Eu corro um serviço WCF Restfull (muito leve, usando este recurso para inspiração: http://msdn.microsoft.com/en-us/magazine/dd315413.aspx ) que (por enquanto) aceita um XmlElement (POX) fornecido através do verbo POST.

Atualmente, estou usando apenas construtor pedido de Fiddler antes de implementar um verdadeiro cliente (como este é ambientes mistos).

Quando faço isso para XML menor do que 65K, ele funciona bem - maior, ele lança esta exceção: A cota de tamanho máximo para as mensagens recebidas (65536) foi excedido. Para aumentar a quota, use a propriedade MaxReceivedMessageSize no elemento de ligação apropriada.

Aqui está o meu arquivo web.config (que eu mesmo incluído o cliente-tag para (tempos de desespero)!):

<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>

Agradecemos antecipadamente por qualquer ajuda levando a chamada succesfull com> 65K XML; -)

Foi útil?

Solução

Tudo bem, este realmente me causou um momento difícil resolver, que vou poupar os outros para. O desafio era na verdade, que eu usei a <%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="fullyQualifiedClassName" %>, que é uma abordagem agradável e implementação fábrica fácil.

No entanto, esta abordagem tem desvantagens; uma vez que nenhuma configuração é necessária no arquivo web.config, a classe WebServiceHostFactory por design não tenha lido a partir do arquivo web.config. Eu sei; Eu poderia herdar desta classe e fazer as mudanças necessárias para que ele pode realmente ler a partir do arquivo de configuração, mas isso parecia um pouco fora do escopo.

Minha solução foi voltar para a forma mais tradicional de implementação do WCF; <%@ ServiceHost Service="fullyQualifiedClassName" CodeBehind="~/App_Code/Catalogue.cs" %>, em seguida, usar os meus valores já configurados no arquivo web.config.

Aqui está o meu arquivo web.config modificada (em relação ao Maddox dor de cabeça):

<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>

Outro benefício dessa mudança é que agora você pode referenciar o seu serviço WCF-rest diretamente do .NET; isso não pode ser feito usando o modelo de fábrica e minha implementação do XmlElement através de fora da solução.

Espero que isso pode ajudar outras pessoas com problemas semelhantes ...

Outras dicas

Eu sei que esta é uma questão muito antiga e já tem uma resposta ...

De qualquer forma ...

O que eu fiz para resolver este "problema" Criei uma fábrica herdada de WebServiceHostFactory e criou um host de serviço personalizado herdado de WebServiceHost

E no hospedeiro I cancelou o 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;
                    }
                }
            }

        }

Eu acho que eu tive o mesmo problema, mas quando eu configurado o padrão obrigatório para webHttp então funcionou:

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

Observe: nenhum nome na ligação.

Esta é uma entrada de blog que eu escrevi que reproduz este problema com uma peça servidor WCF eo cliente absolutamente mínima:

WCF - comprimento da corda lado Fixação cliente exceções

Em particular, você pode precisar de uma ligação personalizada Configuração. Pelo menos reproduzir esta amostra pode lhe dar algumas idéias para sua situação particular.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top