(413)请求实体太大| uploadReadAheadSize


136

我已经用.NET 4.0编写了WCF服务,该服务托管在x64带有IIS 7.5的Windows 7 Ultimate系统上。一种服务方法以“对象”作为参数,我试图发送包含图片的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管理器通过打开站点并转到“管理”下的“配置编辑器”来设置值。不幸的是,我仍然收到“请求实体过大”错误,这真令人沮丧!

那么有人知道我还能尝试解决什么错误吗?


6
10485760 = 10MB,而不是1MB
Shaun Rowan

Answers:


206

那不是IIS的问题,而是WCF的问题。WCF默认情况下将消息限制为65KB,以避免对大消息进行拒绝服务攻击。另外,如果您不使用MTOM,它会将byte []发送到base64编码的字符串(大小增加33%)=> 48KB * 1,33 = 64KB

要解决此问题,您必须重新配置服务以接受较大的消息。此问题以前引发了400 Bad Request错误,但在较新的版本中,WCF开始使用413,这是此类型错误的正确状态代码。

您需要设置maxReceivedMessageSize绑定。您还需要设置readerQuotas

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

8
我已经设置了maxRecievedMessageSize上面的价值,但我仍然得到同样的错误..请求实体太大..
Sandepku

11
@ Sandepku-以防万一...我在很长一段时间里都遇到了同样的问题,然后意识到我给绑定名称起了错误的名字,所以WCF使用默认值而不是我的配置值,并且给了我确切的信息。同样的错误。
阿德里安·卡尔

1
我已经将maxRecievedMessageSize设置为上述值,但是仍然出现相同的错误。请求实体太大。绑定名称不为空。救命!
NetSide 2012年

2
谢谢主席先生,这对您有帮助!为maxReceivedMessageSize设置新值需要为maxBufferSize设置相同的值。
DiligentKarma 2013年

1
@Sandepku,如果您将Webhttpbinding用于REST,则可能需要使<binding>中的绑定名称等于<endpoint>中的
bindingConfiguration

55

我在使用WCF REST服务的IIS 7.5上遇到了相同的问题。尝试通过POST上传65k以上的任何文件,它将返回错误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
谢谢,这对我结合使用IIS 7.5和WCF REST服务非常有用。实际上,我只需要修改maxReceivedMessageSize属性。
Alex Yuly 2014年

我有maxReceivedMessageSize,maxBufferSize可以解决问题,maxBufferPoolSize显示为无效属性。
JabberwockyDecompiler 2015年

4
确保定义绑定名称,并使其等于端点上的bindingConfiguration。例如:<binding name =“ restLargeBinding” maxBufferPoolSize = ..........>。并进行服务配置;<endpoint address =“” binding =“ webHttpBinding” bindingConfiguration =“ restLargeBinding” .......
smoothumut 2015年

2
效果很好,尽管设置transferMode =“ Streamed”给了我一个错误的请求,但不得不删除了这个请求
WtFudgE

1
@smoothumut我知道它已经很旧了,但是bindingConfiguration =“ restLargeBinding”为我成功了!顺便说一句,我正在使用自托管的wcf服务。
ramires.cabral '17

26

我有同样的问题,并设置uploadReadAheadSize解决了它:

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

“该值必须在0到2147483647之间。”

如果您不想执行cmd操作,可以在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>例如,如果将它放在最后,则您知道它在哪里。

希望能解决您的问题。对我来说,这是一个SSL开销问题,其中过多的发布使应用程序冻结,从而引发(413)请求实体太大错误。


1
已经设置maxReceivedMessageSize为int.MaxValue,就可以了。我想知道是否也需要将此选项设置为int.MaxValue吗?
兰登

2
有人知道不通过IIS运行的uploadReadAheadSize是否也与自托管WCF服务相关吗?即,这也是与Windows Server有关的问题吗?
蚂蚁编码

@antscode我有一个自托管的api,并且遇到相同的问题-您是否通过自托管的服务解决了该问题?
Trevor Daniel

18

即使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>

我希望这可以减轻某人的痛苦...


1
感谢您添加此解决方案!间接解决了我的问题,因为我的合同名称在dev中已更改,但更改未正确部署到生产中。检查这些设置解决了由于使用默认消息大小设置而导致的(413)请求实体太大错误。
Doug Knudsen

我很高兴这对某人有所帮助。我为此花了很多时间,所以我希望这可以减轻某人的一天的痛苦。
路加福音

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. 不幸的是,无法更改现有绑定。您必须将其删除并重新添加。润netsh http delete sslcert <ipaddress>:<port>这里<ipaddress>:<port>是IP:在您之前保存的配置显示端口。
  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工作。Stil寻找其他位来切换:-(
Jafin's

8

这帮助我解决了该问题(一行-出于可读性/可复制性的考虑而拆分):

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

您要在SharePoint环境中托管WCF吗?应用更改后是否必须重新启动IIS?
theITvideos

2

对我来说,将uploadReadAheadSizeint.MaxValue 设置为也解决了该问题,同时还增加了WCF绑定的限制。

似乎在使用SSL时,整个请求实体主体都已预加载,为此使用了元数据库属性。

有关更多信息,请参见:

由于请求实体太大,因此未显示该页面。iis7


1
您对SSL和“ uploadReadAheadSize”的发现非常好!..但我不推荐它,虽然设置为最大值
勒纳

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返回true),我已经能够解决此问题。显然,ssl协商是在第一次调用时完成的。因此,无需增加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>
  <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-请求实体太大

由于请求实体太大,因此未显示该页面。

最可能的原因:

  • Web服务器拒绝服务请求,因为请求实体太大。

  • Web服务器无法处理请求,因为它正在尝试协商客户端证书,但是请求实体太大。

  • 请求URL或到URL的物理映射(即,URL内容的物理文件系统路径)太长。

您可以尝试的事情:

  • 验证请求是否有效。

  • 如果使用客户端证书,请尝试:

    • 增加system.webServer/serverRuntime@uploadReadAheadSize

    • 配置SSL端点以协商客户端证书,作为初始SSL握手的一部分。(netsh http添加sslcert ... clientcertnegotiation = enable).vs \ config \ applicationhost.config

通过编辑解决此问题\.vs\config\applicationhost.config。切换serverRuntimeDenyAllow这样的:

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

如果未编辑此值,则在设置时会出现如下错误uploadReadAheadSize

HTTP错误500.19-内部服务器错误

无法访问请求的页面,因为该页面的相关配置数据无效。

此配置部分不能在此路径上使用。当节锁定在父级时,会发生这种情况。锁定默认情况下是(overrideModeDefault =“ Deny”),或者是由一个带有overlayMode =“ Deny”或旧版allowOverride =“ false”的位置标记显式设置的。

然后Web.config使用以下值进行编辑:

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

如果您投反对票,请说为什么。否则很难改善答案。
奥格拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.