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


136

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 오류가 발생하고 정말 실망 스럽습니다!

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


6
10485760 = 1MB가 아닌 10MB
Shaun Rowan

답변:


206

그것은 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>

8
maxRecievedMessageSize를 위의 값으로 설정했지만 여전히 같은 오류가 발생합니다. 요청 엔터티가 너무 큽니다.
Sandepku

11
@ Sandepku- 경우에 대비하여 ... 아주 오랫동안 같은 문제가 있었고 바인딩 이름의 이름이 잘못되었다는 것을 깨달았습니다. 따라서 WCF는 구성 값 대신 기본값을 사용하여 정확한 값을 제공했습니다. 같은 오류.
Adrian Carr

1
maxRecievedMessageSize를 위의 값으로 설정했지만 여전히 같은 오류가 발생합니다. 요청 엔티티가 너무 큽니다. 바인딩 이름이 비어 있지 않습니다. 도움!
NetSide

2
고맙습니다. 도움이되었습니다. maxReceivedMessageSize에 새 값을 설정하려면 maxBufferSize에 동일한 값을 설정해야합니다.
DiligentKarma

1
@Sandepku REST에 webhttpbinding을 사용하는 경우 <binding>의 바인딩 이름을 <endpoint>의 bindingConfiguration과 동일하게
만들어야합니다.

55

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>

2
고마워, 이것은 WCF REST 서비스와 함께 IIS 7.5를 사용하는 데 효과적이었습니다. 실제로 maxReceivedMessageSize 특성 만 수정하면됩니다.
Alex Yuly

maxReceivedMessageSize가 있고 maxBufferSize가 트릭을 수행했으며 maxBufferPoolSize가 잘못된 속성으로 표시했습니다.
JabberwockyDecompiler

4
바인딩 이름을 정의하고 엔드 포인트의 bindingConfiguration과 동일하게하십시오. 예 : <binding name = "restLargeBinding"maxBufferPoolSize = ..........>. 그리고 서비스 구성에서; <endpoint address = ""binding = "webHttpBinding"bindingConfiguration = "restLargeBinding".......
smoothumut

2
transferMode = "Streamed"를 설정하면 잘못된 요청이 있었지만 그 요청을 제거해야했지만 훌륭하게 작동합니다.
WtFudgE

1
@smoothumut 나는 그것이 오래되었다는 것을 알고 있지만 bindingConfiguration = "restLargeBinding"은 나를 위해 속임수를 썼다! 그런데 자체 호스팅 WCF 서비스를 사용하고 있습니다.
ramires.cabral

26

나는 같은 문제가 있었고 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 오버 헤드 문제였습니다 .


1
이미 maxReceivedMessageSizeint.MaxValue로 설정 하면이 트릭을 수행했습니다. 이 옵션을 int.MaxValue로 설정하는 데 중요한 문제가 있는지 궁금합니다.
Langdon

2
uploadReadAheadSize가 IIS를 통해 실행되지 않고 자체 호스팅 WCF 서비스와 관련이 있는지 아는 사람이 있습니까? 즉, 이것은 일반적으로 Windows Server와 관련된 문제입니까?
antscode

@antscode 나는 자체 호스팅 API를 가지고 있으며 같은 문제가 발생합니다-자체 호스팅 서비스로 해결 했습니까?
Trevor Daniel

18

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>

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


1
이 솔루션을 추가해 주셔서 감사합니다! 계약 이름이 dev에서 변경되었지만 변경 사항이 프로덕션에 제대로 배포되지 않았다는 점에서 간접적으로 문제를 해결했습니다. 이 설정을 확인하면 기본 메시지 크기 설정 사용으로 인한 (413) 요청 엔티티가 너무 큼 오류를 해결했습니다.
Doug Knudsen 16:30에

나는 이것이 누군가를 도왔 음을 정말로 기쁘게 생각합니다. 나는 이것에 좋은 시간을 보냈으므로 누군가의 하루를 덜 고통스럽게 만들길 바랐습니다.
Luke

9

이 스레드의 모든 솔루션을 시도했지만이 문제가 발생하고 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=...하여 작동 시키십시오.


게시물을 보내 주셔서 감사합니다. SSL을 사용 중지하면 WCF 오류가 제거됩니다. 불행히도 클라이언트 인증서 협상은 SSL을 통해 작동하도록 결과를 변경하지 않았습니다. 토글 할 다른 비트를 찾기 위해 :-(
Jafin

8

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

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

SharePoint 환경에서 WCF를 호스팅하고 있습니까? 변경 사항을 적용한 후 IIS를 다시 시작해야 했습니까?
theITvideos

2

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

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

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

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


1
SSL 및 'uploadReadAheadSize'에 대한 귀하의 발견은 매우 좋습니다! ..하지만 최대 값으로 설정하지 않는 것이 좋습니다
Learner

1

IIS WCF 오류 413 : 쉐어 포인트에서 요청 엔터티를 많이 요청하고 Sharepoint에서 WCF 서비스를 사용하는 다른 사람을위한 정보입니다. MultipleBaseAddressBasicHttpBindingServiceHostFactory를 사용하는 경우 다른 사이트 / 포스트에서 제안 된 응용 프로그램 호스트 및 web.config의 설정이 SharePoint에서 작동하지 않습니다. SP Powershell을 사용하여 SPWebService.Content 서비스를 가져오고 새 SPWcvSettings 객체를 생성하고 서비스에 대해 위와 같이 설정을 업데이트 할 수 있습니다 (존재하지 않음). 설정을 만들고 추가 할 때 서비스 이름 (예 : [yourservice.svc]) 만 사용하십시오. 자세한 내용은이 사이트를 참조하십시오 https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service


1

필자의 경우 BizTalk 수신 위치의 "최대 수신 메시지 크기"를 늘려야했습니다. 또한 기본값은 64K이므로 web.config에서 구성 한 내용에 관계없이 BizTAlk에서 모든 메시지를 반송했습니다.


1

동일한 wcf 채널 / 클라이언트에서 큰 내용의 요청 직전에 더미 호출 (예 : IsAlive return true)을 실행 하여이 문제를 해결할 수있었습니다. 분명히 ssl negotation은 첫 번째 호출에서 수행됩니다. 따라서 Uploadreadaheadsize를 늘릴 필요가 없습니다.


0

문제에 대해 원격 서버가 예기치 않은 응답을 리턴했습니다. (413) Resful을 사용하여 WCF에서 요청 엔티티가 너무 큼

내 구성 설명을 참조하십시오

</client>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/>

<bindings>

   <!-- this for restfull service -->
  <webHttpBinding>
    <binding name="RestfullwebHttpBinding"
      maxBufferPoolSize="2147483647"
      maxReceivedMessageSize="2147483647"
      maxBufferSize="2147483647" transferMode="Streamed">

      <readerQuotas 
        maxDepth="2147483647" 
        maxStringContentLength="2147483647"
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" /> 

    </binding>
  </webHttpBinding>
  <!-- end -->

   <!-- this for Soap v.2 -->
  <wsHttpBinding>
    <binding name="wsBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
      <!--UsernameToken over Transport Security-->
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="true"/>
      </security>
    </binding>
  </wsHttpBinding>
   <!-- this for restfull service -->

   <!-- this for Soap v.1 -->
  <basicHttpBinding>
    <binding name="basicBinding1" maxReceivedMessageSize="2147483647" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false" transferMode="Streamed">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
      <security mode="None"/>
    </binding>
  </basicHttpBinding>
</bindings> 
<!-- end -->

<services>
  <clear/>

  <service name="ING.IWCFService.CitisecHashTransfer"  >
    <endpoint address="http://localhost:8099/CitisecHashTransfer.svc"
                  behaviorConfiguration="RestfullEndpointBehavior"
                  binding="webHttpBinding"
                  bindingConfiguration="RestfullwebHttpBinding"
                  name="ICitisecHashTransferBasicHttpBinding"
                  contract="ING.IWCFService.ICitisecHashTransfer" />
  </service>

</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ING.IWCFService.IWCFServiceValidator, ING.IWCFService"/>
      </serviceCredentials>
      <serviceSecurityAudit auditLogLocation="Application" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure"/>
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentSessions="100" maxConcurrentInstances="1000"/>

    </behavior>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="EndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior> 
    <behavior name="RestfullEndpointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"  />
      <webHttp/>
    </behavior> 
  </endpointBehaviors>
</behaviors>


0

내 경우에는 서비스의 네임 스페이스가 변경되고 services 태그가 이전 네임 스페이스를 가리 키기 때문에이 오류 메시지가 나타납니다. 네임 스페이스와 오류 표시를 새로 고쳤습니다.

<services>
  <service name="My.Namespace.ServiceName"> <!-- Updated name -->
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyBindingConfiguratioName" 
              contract="My.Namespace.Interface" <!-- Updated contract -->
    />
  </service>
</services>

0

Visual Studio 2017의 IIS Express에서도 비슷한 오류가 발생했습니다.

HTTP 오류 413.0-요청 엔티티가 너무 큼

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

대부분의 원인 :

  • 요청 엔티티가 너무 커서 웹 서버가 요청 서비스를 거부합니다.

  • 웹 서버가 클라이언트 인증서를 협상하려고하지만 요청 엔터티가 너무 커서 요청을 처리 할 수 ​​없습니다.

  • 요청 URL 또는 URL에 대한 물리적 매핑 (즉, URL 내용에 대한 물리적 파일 시스템 경로)이 너무 깁니다.

시도 할 수있는 것 :

  • 요청이 유효한지 확인하십시오.

  • 클라이언트 인증서를 사용하는 경우 다음을 시도하십시오.

    • system.webServer/serverRuntime@uploadReadAheadSize 증가

    • 초기 SSL 핸드 셰이크의 일부로 클라이언트 인증서를 협상하도록 SSL 엔드 포인트를 구성하십시오. (netsh http add sslcert ... clientcertnegotiation = enable) .vs \ config \ applicationhost.config

편집하여이 문제를 해결하십시오 \.vs\config\applicationhost.config. 스위치 serverRuntime에서 DenyAllow이 같은 :

<section name="serverRuntime" overrideModeDefault="Allow" />

이 값을 편집하지 않으면 설정할 때 uploadReadAheadSize다음 과 같은 오류가 발생합니다 .

HTTP 오류 500.19-내부 서버 오류

페이지의 관련 구성 데이터가 유효하지 않기 때문에 요청한 페이지에 액세스 할 수 없습니다.

이 구성 섹션은이 경로에서 사용할 수 없습니다. 이것은 섹션이 부모 수준에서 잠겨있을 때 발생합니다. 잠금은 기본적으로 (overrideModeDefault = "Deny"), overrideMode = "Deny"또는 레거시 allowOverride = "false"를 사용하여 위치 태그에 의해 명시 적으로 설정됩니다.

그런 Web.config다음 다음 값으로 편집 하십시오.

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...

투표를하지 않으면 이유를 말하십시오. 그렇지 않으면 답변을 개선하기가 매우 어렵습니다.
글라스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.