153

我用 .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 管理器通过打开站点并转到管理下的“配置编辑器”来设置值。不幸的是,我仍然收到 Request Entity Too Large 错误,这真的令人沮丧!

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

4

15 回答 15

218

那不是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>
于 2012-04-12T12:39:33.127 回答
63

我在带有 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>
于 2013-06-07T18:30:43.543 回答
28

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

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

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

如果您不想执行 cmd 操作,可以在 applicationHost.config-fle 中轻松设置它。

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

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

根据配置中的评论,解锁部分的推荐方法是使用位置标签:

<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) Request Entity Too Large错误。

于 2013-03-29T08:15:09.303 回答
24

我收到此错误消息,即使我在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>

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

于 2016-03-22T16:19:22.233 回答
10

如果您在尝试了此线程中的所有解决方案后仍遇到此问题,并且您正在通过 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:port 在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=...的命令才能使其工作。

于 2016-03-29T19:04:04.963 回答
9

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

C:\Windows\System32\inetsrv\appcmd  set config "YOUR_WEBSITE_NAME" 
     -section:system.webServer/serverRuntime /uploadReadAheadSize:"2147483647" 
     /commit:apphost
于 2014-04-03T17:51:13.643 回答
3

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

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

有关详细信息,请参阅:

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

于 2017-10-24T13:32:42.713 回答
2

对于任何其他曾经寻找 IIS WCF 错误 413 : Request entity to large 并在 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

于 2015-04-07T21:16:49.160 回答
2

就我而言,我不得不增加 BizTalk 中接收位置的“最大接收消息大小”。这也有一个默认值 64K,因此无论我在 web.config 中配置了什么,每条消息都会被 BizTAlk 退回

于 2015-05-21T11:45:35.353 回答
2

我已经能够通过在同一个 wcf 通道/客户端上具有大量内容的请求之前执行一个虚拟调用(例如 IsAlive 返回 true )来解决这个问题。显然 ssl 协商是在第一次通话时完成的。所以不需要增加Uploadreadaheadsize。

于 2017-09-18T05:14:53.553 回答
2

就我而言,我收到此错误消息是因为我更改了服务的命名空间,并且服务标签指向了旧的命名空间。我刷新了命名空间,错误消失了:

<services>
  <service name="My.Namespace.ServiceName"> <!-- Updated name -->
    <endpoint address="" 
              binding="wsHttpBinding" 
              bindingConfiguration="MyBindingConfiguratioName" 
              contract="My.Namespace.Interface" <!-- Updated contract -->
    />
  </service>
</services>
于 2018-07-12T20:49:34.700 回答
2

添加此内容后,我的问题消失了:

  <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits
                    maxAllowedContentLength="104857600"
                />
            </requestFiltering>
        </security>
  </system.webServer>
于 2021-02-16T23:04:24.077 回答
1

发出远程服务器返回意外响应:(413) Request Entity Too Large on WCF with 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>

于 2018-06-20T09:21:22.420 回答
1

使用 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.configserverRuntime从这样切换Deny到:Allow

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

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

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

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

此配置部分不能在此路径中使用。当该部分锁定在父级别时会发生这种情况。锁定是默认情况下 (overrideModeDefault="Deny") 或由具有 overrideMode="Deny" 或旧 allowOverride="false" 的位置标记显式设置的。

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

<system.webServer>
  <serverRuntime uploadReadAheadSize="10485760" />
...
于 2019-02-25T18:49:27.120 回答
1

将很多回复粘在一起将我需要的所有信息:

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>
于 2022-01-10T15:58:47.517 回答