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