使用 WCF 服务传输大文件 - 检索错误 413

Posted

技术标签:

【中文标题】使用 WCF 服务传输大文件 - 检索错误 413【英文标题】:Transfer large files using WCF Service - Retrieve Error 413 【发布时间】:2020-02-21 20:14:34 【问题描述】:

我知道这个话题已经讨论过很多次了,但不幸的是,所提供的解决方案都不适合我。 我尝试将大文件(最大 1.5 GB)从客户端控制台应用程序传输到 WCF 服务。 但我总是收到 HTTP 错误远程服务器返回了意外响应:(413) Request Entity Too Large. 在传输文件内容时。

我在互联网上找到的所有关于将 maxContentLength 和类似配置添加到 web.config 文件的信息。 但我假设我在 web.config 左右的错误部分输入了它们。

Edit 26.02.2020 18:35(因提示和新测试而更新)

根据上面的提示,我在配置文件中添加了一些条目并进行了更多测试。 与此同时,我发现了一些事情:

web.config 中的数字定义了我在几页上读到的比特而不是字节的大小 数字必须是有效的 int32 - 所以最大值是 2147483647 2147483647 位 大约是 256 MByte - 所以可以理解,我的测试文件大约 400MB 引起了问题

总的来说,如果无法传输大文件 - 至少 20-30 MB 应该是可能的。 对于较大的文件,我会找到其他解决方案。

为了进行更简单的测试,我刚刚创建了一个新的空 WCF 服务和一个控制台应用程序来测试它。

您可以在Google Drive 上找到完整的源代码。 我还附上了一张 22MB 的测试图片,无法传输。

与我的第一个问题不同,我现在收到 404 错误,而不是 413。 因此,当请求与服务不匹配时,IIS 会以某种方式返回 404,而不是之前的 413。 对我来说这是一个非常奇怪的行为。

web.config 和 app.config 看起来还是和以前一样(除了没有实体框架的东西)。

服务器 web.config

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="mybinding"  maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="mybinding" />
    </protocolMapping>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

客户端 app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="mybinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:53042/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="mybinding" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

由于我不是 web.config 配置方面的专家,我假设我只是在 XML 的错误部分添加了配置。 谁能给我一些帮助,我的 web.config 需要是什么样子,我可以传输更大的文件。

提前致谢

问候马库斯

【问题讨论】:

这是客户端还是服务器配置? @SelimYıldız:这是服务器配置 我也将客户端配置添加到 qustion 【参考方案1】:

该服务现在使用ProtocolMapping 部分发布端点,我建议您命名绑定并将配置应用于以下属性。

    <bindings>
      <basicHttpBinding>
        <binding name="mybinding" ... >
        ...
        </binding>
      </basicHttpBinding>
    </bindings>
<protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="mybinding"/>
</protocolMapping>

如果不起作用,我们可以使用以下样式发布服务。

<system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1" bindingConfiguration="mybinding"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
</services>

如果问题仍然存在,请随时告诉我。

【讨论】:

感谢您的提示。不幸的是,我仍然检索到相同的错误(413)。我在第一篇文章中更新了 web.config 以显示它的外观。我是否也需要向客户端 appconfig 添加任何内容? @MarkusH。你可以在客户端试试。这是理论上需要的。另外,你确定现在客户端配置是上面服务器自动生成的吗? 我尝试了服务器上的所有设置 - 最后,客户端 app.config 在更新服务引用后增强到我添加到第一篇文章的版本。在虚拟开发环境中,这些更改后我得到了内存不足的异常。但在我的主计算机上我没有 - 所以我认为这不是一个普遍的问题。但我仍然检索错误 413。(第一篇文章中的配置文件已更新到最新版本) 是的,这可能不是一般问题。请创建一个新的控制台应用程序,添加服务引用,然后使用代理再次调用远程服务。 指的不是位,而是字节。请参阅本文档。它不是指位,而是字节。请参阅本文档。 docs.microsoft.com/en-us/dotnet/api/…

以上是关于使用 WCF 服务传输大文件 - 检索错误 413的主要内容,如果未能解决你的问题,请参考以下文章

WCF错误:413 Request Entity Too Large

传递大字节 [] 时 WCF 服务错误 413“实体太大”

WCF 相关配置

WCF:远程服务器返回错误:(413)请求实体太大[重复]

具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大

(413) 请求实体太大 - 在 Azure 上上传 Wcf 时