在IIS7上使用WCF服务上载大文件时出现错误413

时间:2012-03-12 14:49:37

标签: asp.net asp.net-mvc wcf iis-7

我有一个Web应用程序,可以让用户上传文件。然后使用另一个服务上的WCF服务保存文件。这个上传工作正常,直到我上传4.5 MB左右的文件。当我上传一个超过一定大小的文件时,我收到错误:

肥皂错误:413服务器拒绝处理请求,因为请求实体大于服务器愿意或能够处理的请求...

此错误出现在运行WCF服务的服务器的系统事件日志中。

我发现的解决方案告诉我更改applicationHost配置文件中的maxAllowedContentLength和uploadReadAheadSize设置。但是,如果将maxAllowedContentLength设置为非常小并且更改uploadReadAheadSize值,则将maxAllowedContentLength更改为仅创建了不同的错误,这对问题没有任何影响。有谁知道我要改变什么以及我必须改变它?我一直在寻找几个小时,我开始变得不耐烦了:(。感谢您的帮助!

编辑:

确定位于生产系统上的WCF服务的web.config如下所示。这是位于WCF Web服务的IIS站点指向的文件夹中的web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <handlers>
        <add name="SOAP" path="*.wsdl" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files (x86)\Common Files\MSSoap\Binaries\SOAPIS30.dll" resourceType="Unspecified" preCondition="bitness32" />
        <add name="WSDL Mapping" path="*.wsdl" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Common Files\MSSoap\Binaries\SOAPIS30.dll" resourceType="Unspecified" />
    </handlers>
</system.webServer>
</configuration>

测试系统的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
    <handlers>
        <add name="WSDL Mapping" path="*.wsdl" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Common Files\MSSoap\Binaries\SOAPIS30.dll" resourceType="Unspecified" />
    </handlers>
</system.webServer>
</configuration>

如您所见,任何一个文件中都没有提及任何内容长度或任何内容。我不得不承认,在这一点上我很难过。但就像我说的那样,我不是IIS的专家。

编辑2:

以下是我的Web应用程序的web.config的

的serviceModel节点
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="WsJobsSoapBinding" closeTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://srvts01test:90/WsJobs.WSDL" binding="basicHttpBinding" bindingConfiguration="WsJobsSoapBinding" contract="JobsWs.WsJobsSoapPort" name="WsJobsSoapPort"/>
    </client>
</system.serviceModel>

这是我的Web应用程序的web.config,它调用WCF服务而不是WCF服务本身的web.config。再次感谢您的帮助:)

3 个答案:

答案 0 :(得分:0)

您想要更改MaxReceivedMessageSize。

我认为当我这样做时,我还必须将MaxBufferPoolSize更改为相同的值。

你可以通过配置或像这样的代码来实现。

            binding.MaxBufferPoolSize = 67108864;
            binding.MaxReceivedMessageSize = 67108864;

答案 1 :(得分:0)

我发现了一篇文章,讨论了您在聊天中提到的45KB大小限制。它包括所做的配置更改。

http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP

您的测试环境可能已经进行了这些更改,因此需要考虑/考虑一件事。人们有时在部署期间不会覆盖配置文件,因此您可能在那里使用旧文件。

答案 2 :(得分:0)

我的WCF服务中也出现了这413个错误,该服务在.Net 4.5下运行。

解决方案很简单。

以前,我的web.config包含:

  <services>
    <service name="PocketCRMServices.Service1">
      <endpoint address="../Service1.svc"
        binding="webHttpBinding"
        contract="PocketCRMServices.IService1"
        behaviorConfiguration="webBehaviour" />
    </service>
  </services>

因此,默认情况下,它已经在使用webHttpBinding绑定。

为了摆脱413错误,我只需要在本节后直接添加:

<bindings>
  <webHttpBinding>
    <binding maxReceivedMessageSize="2147483647"
             maxBufferPoolSize="2147483647777" >
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                    maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
</bindings>

就是这样。