x64
IIS 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 오버 헤드 문제였습니다 .
답변
max
WCF 서비스 구성 파일의 바인딩 내에서 설정을 설정 했지만이 오류 메시지가 나타납니다 .
<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 서버에서 수행해야 할 단계는 다음과 같습니다.
- cmd 또는 powershell을 통해을 실행하십시오
netsh http show sslcert
. 현재 구성이 제공됩니다. 나중에 다시 참조 할 수 있도록이 방법을 저장하고 싶을 것입니다. - “클라이언트 인증서 협상”이 비활성화되어 있습니다. 이것이 문제 설정입니다. 다음 단계는이를 활성화하는 방법을 보여줍니다.
- 불행히도 기존 바인딩을 변경할 수있는 방법이 없습니다. 삭제 한 후 다시 추가해야합니다. 앞에서 저장 한 구성에 표시된 IP : 포트가있는
netsh http delete sslcert <ipaddress>:<port>
곳에서 실행하십시오<ipaddress>:<port>
. - 이제 바인딩을 다시 추가 할 수 있습니다.
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을 사용할 때 전체 요청 엔터티 본문이 미리로드되어이 메타베이스 속성이 사용되는 것 같습니다.
자세한 내용은 다음을 참조하십시오.