(413)请求实体太大 | uploadReadAheadSize

我写了一个 WCF 服务。NET 4.0,这是托管在我的 Windows 7 x64终极系统与 IIS 7.5。 其中一个服务方法有一个“ object”作为参数,我试图发送一个包含图片的 byte []。 只要这张图片的文件大小小于大约48KB,一切都很顺利。但是如果我试图上传更大的图片,WCF 服务将返回一个错误: (413) Request Entity Too Large. 当然,我花了3个小时在 Google 上搜索这个错误消息,我看到的每个关于这个主题的主题都建议提高“ 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 管理器来设置值,方法是打开站点并转到 Management 下的“配置编辑器”。 不幸的是,我仍然得到请求实体太大的错误,这是真的令人沮丧!

有人知道我还可以尝试修复哪些错误吗?

297376 次浏览

这不是 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>

我遇到了同样的问题,设置 uploadReadAheadSize解决了它:

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

“该值必须介于0和2147483647之间。”

如果您不想做 cmd-thing,可以在 applicationHost.config-file 中轻松地设置它。

它位于 WindowsFOLDER\System32\inetsrv\config(2008服务器)中。

您必须用记事本打开它。请先备份文件。

根据 config 中的注释,解锁部分的推荐方法是使用 location 标记:

<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)请求实体太大错误。

我在使用 WCF REST 服务时遇到了与 IIS 7.5相同的问题。试图通过 POST 上传任何超过65k 的文件,它会返回错误413“请求实体太大”。

您需要理解的第一件事是您在 web.config 中配置了哪种绑定。这是一篇很棒的文章。

BasicHttpBinding vs WsHttpBinding vs WebHttpBinding

如果您有一个 REST 服务,那么您需要将其配置为“ webHttpBinding”:

<system.serviceModel>


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

这帮助我解决了这个问题(可读性/可复制性分为一行) :

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

对于任何其他寻找 IIS WCF 错误413: 请求实体大并在 Sharepoint 中使用 WCF 服务的人来说,这是为您提供的信息。如果使用 MultipleBaseAddressBasicHttpBindingServiceHostFactory,则应用程序主机中的设置和其他站点/帖子中建议的 web.config 在 SharePoint 中无法工作。您可以使用 SP Powershell 来获取 SPWebService。内容服务,创建一个新的 SPWcvSettings 对象,并像上面那样更新服务的设置(它们不存在)。在创建和添加设置时,请记住只使用服务的名称(例如[ yourservice.svc ])。请参阅此网站了解更多信息 https://robertsep.wordpress.com/2010/12/21/set-maximum-upload-filesize-sharepoint-wcf-service

在我的例子中,我必须在 BizTalk 中增加接收位置的“最大接收消息大小”。它的默认值也是64K,所以不管我在 web.config 中配置了什么,BizTalk 都会弹出每条消息

即使在 WCF 服务配置文件的绑定中设置了 max设置,我还是收到了这个错误消息:

<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)连接到服务时请求实体太大。

问题

我意识到 web.config<service>标签中的 name=""属性是 没有自由文本字段,正如我所想的那样。它就是 本文件页中提到的 服务契约实现的完全限定名称

如果不匹配,那么将不会应用绑定设置!

<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. 不幸的是,没有办法更改现有的绑定; 您必须删除它并重新添加它。运行 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 绑定,您将为每个 SSL 绑定重复这个过程。希望这可以帮助其他人减轻这个问题给我带来的长时间的头痛。

编辑: 根据我的经验,您实际上不能从命令行直接运行 netsh http add sslcert命令。您需要首先输入 netsh,输入 netsh 提示符,然后发出类似于 http add sslcert ipport=...的命令,这样它才能正常工作。

我可以通过在请求之前执行一个虚拟调用(例如 IsAlive 返回 true)来解决这个问题,该调用在同一个 wcf 通道/客户机上包含大量内容。显然 ssl 的谈判在第一次通话时就结束了。所以不需要增加 Uploadreadaheadsize。

对于我来说,将 uploadReadAheadSize设置为 int。MaxValue 在增加了 WCF 绑定的限制之后,也解决了这个问题。

看起来,在使用 SSL 时,整个请求实体体是预加载的,这个元数据库属性用于预加载。

有关更多信息,请参见:

页面没有显示,因为请求实体太大

为发出远程服务器返回一个意外的响应: (413)请求实体太大在 WCF 与 Resful

请看我的解释配置

</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>

在我的例子中,我得到了这个错误消息,因为我更改了服务的名称空间,并且 services 标记指向了较旧的名称空间。我刷新了名称空间,错误消失了:

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

在 VisualStudio2017的 IISExpress 上也出现了类似的错误。

HTTP 错误413.0-请求实体太大

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

最可能的原因:

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

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

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

你可以尝试的事情:

  • 验证请求是否有效。

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

    • 增加 system.webServer/serverRuntime@uploadReadAheadSize

    • 将 SSL 端点配置为协商客户端证书 最初的 SSL 握手(netsh http 添加 sslcert..。 对比 config applicationhost.config

通过编辑 \.vs\config\applicationhost.config来解决这个问题。像这样将 serverRuntimeDeny切换到 Allow:

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

如果未编辑此值,则在设置 uploadReadAheadSize时将得到如下错误:

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

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

无法在此路径上使用此配置节 当节在父级别锁定时 Default (overrideModeDefault = “ Deny”) ,或者由位置显式设置 使用 overrideMode = “ Deny”或遗留 allowOverride = “ false”的标记。

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

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

在我添加了以下内容之后,我的问题就解决了:

  <system.webServer>
<security>
<requestFiltering>
<requestLimits
maxAllowedContentLength="104857600"
/>
</requestFiltering>
</security>
</system.webServer>

把许多答案粘在一起,就会得到我需要的所有信息:

IIS 配置: C: Windows System32 inetsrv Config applicationHost.Config (非常底部)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
...
<location path="Default Web Site">
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert" />
<!-- Max upload size in bytes -->
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>