[wcf] (413) 요청 엔티티가 너무 큼 | uploadReadAheadSize

x64IIS 7.5가 설치된 Windows 7 Ultimate 시스템 에서 호스팅되는 .NET 4.0으로 WCF 서비스를 작성했습니다 . 서비스 메소드 중 하나에 인수로 ‘객체’가 있으며 그림이 포함 된 byte []를 보내려고합니다. 이 사진의 파일 크기가 대략 다음보다 작습니다. 48KB, 모두 잘 작동합니다. 그러나 더 큰 그림을 업로드하려고하면 WCF 서비스가 오류를 반환합니다. (413) Request Entity Too Large.
물론 3 시간 동안 오류 메시지를 인터넷 검색 했으며이 주제에 대해 본 모든 주제는 ‘uploadReadAheadSize’속성을 올리는 것을 제안합니다. 그래서 내가 한 일은 다음 명령을 사용하는 것입니다 (10485760 = 10MB).

"appcmd.exe set config -section:system.webserver/serverruntime/uploadreadaheadsize: 10485760 /commit:apphost"

"cscript adsutil.vbs set w3svc/<APP_ID>/uploadreadaheadsize 10485760"

또한 IIS 관리자를 사용하여 사이트를 열고 관리에서 “구성 편집기”로 이동하여 값을 설정했습니다. 불행히도 여전히 Request Entity Too Large 오류가 발생하고 정말 실망 스럽습니다!

아무도 내가이 오류를 해결하려고 할 수있는 것을 알고 있습니까?



답변

그것은 IIS의 문제가 아니라 WCF의 문제입니다. 기본적으로 WCF는 큰 메시지로 인한 서비스 거부 공격을 피하기 위해 메시지를 65KB로 제한합니다. 또한 MTOM을 사용하지 않으면 byte []를 base64로 인코딩 된 문자열로 보냅니다 (33 % 증가) => 48KB * 1,33 = 64KB

이 문제를 해결하려면 더 큰 메시지를 수락하도록 서비스를 재구성해야합니다. 이 문제는 이전에 400 잘못된 요청 오류를 발생 시켰지만 최신 버전에서 WCF는이 유형의 오류에 대한 올바른 상태 코드 인 413을 사용하기 시작했습니다.

maxReceivedMessageSize바인딩에서 설정해야합니다 . 을 설정해야 할 수도 있습니다 readerQuotas.

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding maxReceivedMessageSize="10485760">
        <readerQuotas ... />
      </binding>
    </basicHttpBinding>
  </bindings>
</system.serviceModel>


답변

WCF REST 서비스를 사용하는 IIS 7.5와 동일한 문제가 발생했습니다. 65k를 초과하는 파일을 POST를 통해 업로드하려고하면 오류 413 “요청 엔티티가 너무 큼”이 반환됩니다.

가장 먼저 이해해야 할 것은 web.config에서 어떤 종류의 바인딩을 구성했는지입니다. 여기 좋은 기사가 있습니다 …

BasicHttpBinding 및 WsHttpBinding 및 WebHttpBinding

REST 서비스가있는 경우 “webHttpBinding”으로 구성해야합니다. 수정 사항은 다음과 같습니다.

<system.serviceModel>

<bindings>
   <webHttpBinding>
    <binding
      maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647"
      maxBufferSize="2147483647" transferMode="Streamed">
    </binding>
   </webHttpBinding>
</bindings>


답변

나는 같은 문제가 있었고 uploadReadAheadSize해결했다.

http://www.iis.net/configreference/system.webserver/serverruntime

“값은 0과 2147483647 사이 여야합니다.”

cmd-thing을 원하지 않으면 applicationHost.config-fle에서 쉽게 설정할 수 있습니다.

그 위치에서 WindowsFOLDER\System32\inetsrv\config(2008 서버).

메모장으로 열어야합니다. 먼저 파일 백업을 수행하십시오.

config의 주석에 따르면 섹션 잠금을 해제하는 권장 방법은 위치 태그를 사용하는 것입니다.

<location path="Default Web Site" overrideMode="Allow">
    <system.webServer>
        <asp />
    </system.webServer>
</location>"

그래서 당신은 바닥에 쓸 수 있습니다 (이전에 존재하지 않았기 때문에). 나는 maxvalue여기에 씁니다 -원한다면 자신의 가치를 쓰십시오.

<location path="THENAMEOFTHESITEYOUHAVE" overrideMode="Allow">
    <system.webServer>
        <asp />
        <serverRuntime uploadReadAheadSize="2147483647" />
    </system.webServer>
</location>

</configuration>예를 들어 이전 에 마지막으로 놓으면 어디에 있는지 알 수 있습니다.

문제가 해결되기를 바랍니다. 너무 많은 게시물로 인해 응용 프로그램이 정지되어 (413) 요청 엔티티가 너무 큼 오류가 발생 하는 SSL 오버 헤드 문제였습니다 .


답변

maxWCF 서비스 구성 파일의 바인딩 내에서 설정을 설정 했지만이 오류 메시지가 나타납니다 .

<basicHttpBinding>
        <binding name="NewBinding1"
                 receiveTimeout="01:00:00"
                 sendTimeout="01:00:00"
                 maxBufferSize="2000000000"
                 maxReceivedMessageSize="2000000000">

                 <readerQuotas maxDepth="2000000000"
                      maxStringContentLength="2000000000"
                      maxArrayLength="2000000000"
                      maxBytesPerRead="2000000000"
                      maxNameTableCharCount="2000000000" />
        </binding>
</basicHttpBinding>

이러한 바인딩 설정이 적용되지 않은 것처럼 보이므로 다음 오류 메시지가 표시됩니다.

IIS7-(413) 서비스에 연결할 때 요청 엔티티가 너무 큽니다.

.

문제

나는 것을 깨달았다 name=""내에서 속성 <service>의 태그 web.config입니다 하지 내가 생각했던대로, 자유 텍스트 필드. 그것은이다 서비스 계약의 구현의 완전한 이름 과 같은에서 언급 된 이 문서 페이지 .

일치하지 않으면 바인딩 설정이 적용되지 않습니다!

<services>
  <!-- The namespace appears in the 'name' attribute -->
  <service name="Your.Namespace.ConcreteClassName">
    <endpoint address="http://localhost/YourService.svc"
      binding="basicHttpBinding" bindingConfiguration="NewBinding1"
      contract="Your.Namespace.IConcreteClassName" />
  </service>
</services>

누군가가 고통을 덜어주기를 바랍니다.


답변

이 스레드의 모든 솔루션을 시도했지만이 문제가 발생하고 SSL (예 : https)을 통해 서비스에 연결하는 경우 다음과 같은 도움이 될 수 있습니다.

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

요약하면 (링크가 나중에 중단 될 경우) 요청이 충분히 클 경우 클라이언트와 서비스 간의 인증서 협상이 무작위로 실패합니다. 이런 일이 발생하지 않도록하려면 SSL 바인딩에서 특정 설정을 사용해야합니다. IIS 서버에서 수행해야 할 단계는 다음과 같습니다.

  1. cmd 또는 powershell을 통해을 실행하십시오 netsh http show sslcert. 현재 구성이 제공됩니다. 나중에 다시 참조 할 수 있도록이 방법을 저장하고 싶을 것입니다.
  2. “클라이언트 인증서 협상”이 비활성화되어 있습니다. 이것이 문제 설정입니다. 다음 단계는이를 활성화하는 방법을 보여줍니다.
  3. 불행히도 기존 바인딩을 변경할 수있는 방법이 없습니다. 삭제 한 후 다시 추가해야합니다. 앞에서 저장 한 구성에 표시된 IP : 포트가있는 netsh http delete sslcert <ipaddress>:<port>곳에서 실행하십시오 <ipaddress>:<port>.
  4. 이제 바인딩을 다시 추가 할 수 있습니다. netsh http add sslcert 여기서 유효한 매개 변수 (MSDN)를 볼 수 있지만 대부분의 경우 명령은 다음과 같습니다.

netsh http add sslcert ipport=<ipaddress>:<port> appid=<application ID from saved config including the {}> certhash=<certificate hash from saved config> certstorename=<certificate store name from saved config> clientcertnegotiation=enable

SSL 바인딩이 여러 개인 경우 각각에 대해 프로세스를 반복합니다. 바라건대 이것은이 문제로 인해 두통의 시간과 시간을 절약 할 수 있기를 바랍니다.

편집 : 내 경험상 실제로 netsh http add sslcert명령 줄에서 직접 명령을 실행할 수 없습니다 . netsh 프롬프트를 먼저 입력 netsh한 다음 명령을 실행 http add sslcert ipport=...하여 작동 시키십시오.


답변

이것은 문제를 해결하는 데 도움이되었습니다 (한 줄-가독성 / 복사 가능성을 위해 나눕니다).

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME"
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647"
     /commit:apphost


답변

uploadReadAheadSize에게 int.MaxValue를 설정 하면 WCF 바인딩에 대한 제한이 증가한 후에도 문제가 해결되었습니다.

SSL을 사용할 때 전체 요청 엔터티 본문이 미리로드되어이 메타베이스 속성이 사용되는 것 같습니다.

자세한 내용은 다음을 참조하십시오.

요청 엔티티가 너무 커서 페이지가 표시되지 않았습니다. iis7