如何将大型(> 25MB)文件上载到Web服务?

Chr*_*Dog 29 .net iis-7 web-services large-file-upload

我有一个Web服务,它接受一个byte []并保存它.

这适用于"小"文件,但是一旦我达到一定的大小,Web服务就会失败并返回"请求失败,HTTP状态为404:未找到".

从我所看到的,这似乎是一个IIS设置,限制了可以发布的文件的大小(以防止拒绝服务攻击).我试图增加那个设置,但是我无法确定设置的位置和设置方式.我正在使用IIS7,而web服务是在.net(asmx)中完成的.

在Web服务的web.config中,我添加了以下内容(这似乎增加了可以接受的文件大小,但不是一直到这个设置大小)

  <system.web>
     <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
     ...
  </system.web>
Run Code Online (Sandbox Code Playgroud)

有关增加Web服务的文件大小的位置(以及如何)的任何建议将非常感激.

Chr*_*Dog 31

除了问题中提到的httpRuntime/maxRequestLength之外,看起来还有一个附加项可以添加到Web服务的web.config文件中以允许大文件传输.

  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2000000000" />
      </requestFiltering>
    </security>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

这似乎可以通过Web服务上传更大的文件.

  • 只是注意到这一点:你错过这个设置的一个迹象是当你从WCF服务获得404时,但是在WCF跟踪中没有错误消息(是的,我知道非常有帮助 - 感谢WCF).很高兴你找到了这个克里斯,你已经救了我在这上面浪费了更多的时间. (5认同)
  • @AndyBritcliffe"谢谢WCF".在我看来,在这种情况下,404源自IIS本身,因此WCF可能甚至没有听说过该事件,因此几乎没有机会记录任何有关它的事情.改为"谢谢微软",但批评仍然存在.:) (2认同)

Joh*_*ers 5

您应该记住,Web服务主要不是设计为文件传输机制.任何专门设计的文件传输协议都可能比Web服务做得更好.例如,此类协议更有可能处理错误恢复,部分上传等.

但是,如果您要在.NET中为此目的使用Web服务,则应尽可能使用WCF.除了其他好处之外,WCF处理流式传输,因此在内存使用方面会更高效.我担心如果你遵循上面的两个(准确的)建议,你的下一个结果将是"内存或资源不足"的异常,因为旧的ASMX技术试图一次将整个25MB文件加载到内存中.事实上,它可能同时在内存中有几个副本!


Sam*_*ron 5

如果我不得不使用Web服务并且需要支持非常大的文件,我会考虑实现一个允许您分段上传文件的系统.

例如.

  • ticketId GetTicket(大小)
  • UploadData(ticketId,byte [] payload)(可以根据需要多次调用)
  • FinalizeUpload(ticketId)

这将允许您对大型上传进行分块,而不是在内存中保留太多数据.缺点是您仍然使用相当低效的传输机制.


son*_*abo 5

只是为google这个web.config的人添加信息:

C:\ Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI

<location path="Copy.asmx"> <!-- Name of you asmx -->
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
        </requestFiltering>
      </security>
    </system.webServer>
  </location>
Run Code Online (Sandbox Code Playgroud)

这解决了我们在解决这个问题很长时间之后的问题.