ProgramingTip

(400) HTTP 잘못된 요청으로 인해 큰 WCF 웹 서비스 요청 실패 함

bestdevel 2020. 10. 21. 21:14
반응형

(400) HTTP 잘못된 요청으로 인해 큰 WCF 웹 서비스 요청 실패 함


나는이 명백한 문제에 직면하고 있습니다.

배열 변수에 최후의 몇 가지 항목을 사용하여 WCF 웹 서비스를 호출하면 (최대 50 개까지 테스트했습니다) 모든 것이 정상입니다.

그러나 500 개의 항목으로 웹 서비스를 호출하면 잘못된 요청 오류가 발생합니다.

흥미롭게도 서버 에서 Wireshark실행 요청이 서버에 도달하지 않는 것입니다. 클라이언트 측에서 400 오류가 생성되고 있습니다.

예외는 다음과 가변적입니다.

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.

system.serviceModel내 클라이언트 구성 파일 섹션은 다음과 가변적입니다.

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true"
                        establishSecurityContext="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://serviceserver/MyService.svc"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService"
            contract="SmsSendingService.IMyService" name="WSHttpBinding_IMyService" />
    </client>
</system.serviceModel>

서버 측에서 내 web.config 파일에는 다음 system.serviceModel섹션이 있습니다.

<system.serviceModel>
    <services>
        <service name="MyService.MyService" behaviorConfiguration="MyService.MyServiceBehaviour" >
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyService.MyServiceBinding" contract="MyService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="MyService.MyServiceBinding">
          <security mode="None"></security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyService.MyServiceBehaviour">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

나는 한 행사많은 상당히 대답이 질문성공하지 .

누구든지 이것으로 나를 도울 수 있습니까?


서버는 maxReceivedMessageSize를 설정해 사용합니다 (예 : 4MB).

    <binding name="MyService.MyServiceBinding" 
           maxReceivedMessageSize="4194304">

너무 낮은 주된 이유는 서비스 거부 (DoS) 공격의 위험을 위해서입니다. 서버의 최대 요청 크기와 클라이언트의 최대 응답 크기보다 크게 설정해야합니다. 인트라넷 환경에있는 경우 DoS 공격의 위험이 낮을 수 있으므로 필요로하는 것보다 훨씬 높은 값을 사용하는 것이 안전 할 수 있습니다.

그런데 WCF 서비스 연결 문제를 해결하기위한 몇 가지 팁 :

  • 이 MSDN 문서에 설명 된대로 서버에서 추적을 활성화합니다 .

  • 클라이언트에서 Fiddler 와 같은 HTTP 디버깅 도구를 사용 하여 HTTP 트래픽을 검사합니다.


나는 또한이 문제를 겪고 있었지만 오랜 시간 파고 한 후 사용자 정의 바인딩 (BinaryXML 용)을 사용했기 때문에 위의 어느 것도 나를 위해 일하지 않았습니다.

Silverlight에서 WCF로 큰 XML 보내기

customBinding을 사용할 때 maxReceivedMessageSize는 web.config의 바인딩 요소 아래에있는 httpTransport 요소에 설정되어야합니다.

<httpsTransport maxReceivedMessageSize="4194304" /> 

.NET 4.0을 사용할 때 추가로 고려해야 할 사항은 구성에 유효한 끝 점이없는 경우 기본 끝 점이 자동으로 만들어지고 사용된다는 것입니다.

기본 엔드 포인트는 모든 기본값을 사용하므로 maxReceivedMessageSize 등의 값이 큰 유효한 서비스 구성이 있다고 생각하지만 구성에 문제가있는 경우 기본 엔드 포인트가 다음과 같기 때문에 여전히 400 개의 잘못된 요청을 받게됩니다. 만들고 사용했습니다.

이것은 자동으로 수행되므로 감지하기 어렵습니다. 서버에서 추적을 설정했지만 다른 표시가없는 경우 (예 : '서비스에 대한 엔드 포인트를 찾을 수 없음, 기본 엔드 포인트 생성'또는 이와 유사한)이 효과에 대한 메시지가 표시됩니다.


web.config의 .NET 4.0 서버에서 기본 바인딩도 변경해야합니다. 다음과 같은 3 가지 매개 변수를 설정합니다.

 < basicHttpBinding>  
   < !--http://www.intertech.com/Blog/post/NET-40-WCF-Default-Bindings.aspx  
    - Enable transfer of large strings with maxBufferSize, maxReceivedMessageSize and maxStringContentLength
    -->  
   < binding **maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"**>  
      < readerQuotas **maxStringContentLength="2147483647"**/>            
   < /binding>

클라이언트를 디버그하고 Tools \ Options \ Debugging \ General \ 'Enable Just My Code'를 끄고 Debug \ Exceptions \ 'catch all first-chance exceptions'를 클릭하여 관리되는 CLR 예외가 있는지 확인하는 것이 유용 할 수 있습니다. 프로토콜 예외 전과 메시지가 연결되기 전에 클라이언트에서 예외가 발생합니다. (내 추측은 일종의 직렬화 실패 일 것입니다.)


원래 오류에 대한 자세한 내용을 보려면 WCF 로깅을 켤 수도 있습니다. 이 문제를 해결하는 데 도움이되었습니다.

web.config에 다음을 추가하면 C : \ log \ Traces.svclog에 로그가 저장됩니다.

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel"
                  switchValue="Information, ActivityTracing"
                  propagateActivity="true">
            <listeners>
                <add name="traceListener"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "c:\log\Traces.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

그냥 지적하고 싶어

MaxRecivedMessageSize 외에도 ReaderQuotas 아래에 속성이 있으므로 크기 제한 대신 항목 수 제한에 도달 할 수 있습니다. MSDN 링크는 여기


Bad Request 400 문제에 대한 답을 찾았습니다.

기본 서버 바인딩 설정입니다. 서버 및 클라이언트 기본 설정에 추가해야합니다.

binding name = ""openTimeout = "00:10:00"closeTimeout = "00:10:00"receiveTimeout = "00:10:00"sendTimeout = "00:10:00"maxReceivedMessageSize = "2147483647"maxBufferPoolSize = "2147483647 "maxBufferSize ="2147483647 ">


제 경우에는 모든 솔루션을 시도하고 모든 제한을 최대로 설정 한 후에도 작동하지 않았습니다. 마지막으로 Microsoft IIS 필터링 모듈 Url Scan 3.1 이 IIS / 웹 사이트에 설치되어 있음을 발견했습니다. IIS / 웹 사이트에는 콘텐츠 크기에 따라 들어오는 요청을 거부하고 "404 찾을 수 없음 페이지"를 반환하는 자체 제한이 있습니다.

제한은 필요한 값 %windir%\System32\inetsrv\urlscan\UrlScan.ini으로 설정 MaxAllowedContentLength하여 파일 에서 업데이트 할 수 있습니다 .

예를 들어. 다음은 최대 300MB 요청을 허용합니다.

MaxAllowedContentLength = 314572800

누군가를 도울 수 있기를 바랍니다!

참고 URL : https://stackoverflow.com/questions/784606/large-wcf-web-service-request-failing-with-400-http-bad-request

반응형