WCF 400 Bad request

Данная проблема начала возникать на моем сервисе. После гугления интернета наткнулся на то что она может проявляться из-за неверного представления адреса сервиса или из-за больших объемов данных. Есть наверняка и множество других причин, но в моем случае это был большой объем данных получаемый на входе сервисом.

Данную проблему можно решить двумя способами:
1 Посредством исправления web.config . Курсивом и жирным обозначено что нужно поправить. Веб конфиг необходимо править если вы развертываете сервис на своем IIS

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfService2.Service1Behavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />          
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="WcfService2.Service1Behavior"
        name="WcfService2.Service1">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="b1" contract="WcfService2.IService1">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="b1" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="2147483647"
                        maxNameTableCharCount="2147483647" />

        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>

2 Второй способ актуален для тех кто развертывает сервис через new ServiceHost() . Почитать о нём можно тут . В данном случае мы меняем readerQuotas программно.

using (ServiceHost host = new ServiceHost(typeof(WCF_Lic_SA.ServiceLicSA), new Uri("http://localhost:8202/MyService")))
            {
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

                smb.HttpGetEnabled = true;
                smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                host.Description.Behaviors.Add(smb);
                host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
                host.OpenTimeout = TimeSpan.FromSeconds(10);

                BasicHttpBinding b = new BasicHttpBinding();

                System.Xml.XmlDictionaryReaderQuotas myReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas();
                myReaderQuotas.MaxArrayLength = 2147483647;
                myReaderQuotas.MaxBytesPerRead = 2147483647;
                myReaderQuotas.MaxDepth = 2147483647;
                myReaderQuotas.MaxNameTableCharCount = 2147483647;
                myReaderQuotas.MaxStringContentLength = 2147483647;
                b.ReaderQuotas = myReaderQuotas;
                b.MaxBufferPoolSize = 2147483647;
                b.MaxBufferSize = 2147483647;
                b.MaxReceivedMessageSize = 2147483647;

                host.AddServiceEndpoint(typeof(WCF_Lic_SA.IServiceLicSA), b, "");

                host.Open();
            }

No comments:

Post a Comment