29

我有一个网络服务,它需要一个字节 [] 并保存它。

这适用于“小”文件,但一旦达到一定大小,Web 服务就会失败并返回“请求失败,HTTP 状态 404:未找到”。

从我所见,这似乎是一个 IIS 设置,它限制了可以发布的文件的大小(以防止拒绝服务攻击)。我试图增加该设置,但我无法确定设置什么以及在哪里/如何设置它。我正在使用 IIS7,并且 web 服务是在 .net (asmx) 中完成的。

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

  <system.web>
     <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
     ...
  </system.web>

任何有关在何处(以及如何)增加 Web 服务的文件大小的建议将不胜感激。

4

8 回答 8

33

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

  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2000000000" />
      </requestFiltering>
    </security>
  </system.webServer>

这似乎可以通过网络服务上传更大的文件。

于 2009-06-30T23:28:35.683 回答
6

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

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

于 2009-06-15T23:38:33.297 回答
5

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

例如。

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

这将允许您将大上传文件分块,并且不会在内存中保存太多数据。缺点是您仍在使用相当低效的传输机制。

于 2009-06-15T23:58:22.017 回答
5

只是为了向搜索此 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>

在解决了这个问题相当长的一段时间后,这解决了我们的问题。

于 2010-10-19T09:01:59.127 回答
4

如果您打算使用 Web 服务来移动文件,我至少会考虑使用 WS-Attachment / DIME 附件。通过 Web 服务发送 byte[] 的主要问题是它们被放入 SOAP 主体中,该主体被编码为 base 64 字符串。像这样对文件进行编码会使soap 正文中的文件大小增加三分之二(即,6 MB 的文件通过网络变成9 MB 的文件)。

您上传的 25 MB 可能会变成巨大的肥皂信封。

我强烈建议阅读这篇文章。这可能会让你进入 DIME。

这是一个摘录。

Microsoft 的 WSE Toolkit 允许使用 DIME 和 WS-Attachments 标准与 Web 服务方法一起发送大型附件。我们将研究这些标准以及为什么它们比通过其他常用方法在 Web 服务调用中发送大量二进制数据更有效。

希望有帮助!

于 2009-06-15T23:47:34.007 回答
1

maxRequestLength 以 KB 为单位,而不是字节。这应该在 4 分钟的超时窗口内为您提供 30 MB 的限制。

<httpRuntime executionTimeout="240" maxRequestLength="30000" />

数字太高实际上可能会阻止您的值被应用。我我几年前遇到了这个问题,当时我认为这是一个字节限制(模糊的记忆)。

于 2009-06-15T23:32:12.857 回答
1

这并没有具体回答您的问题,但我过去所做的是使用 WCF 传输文件名/路径/列表,然后使用 FTP 库通过 FTP 传输文件。

于 2009-06-15T23:41:43.867 回答
1

这对我有用:

            <binding name="uploadFilesBasicHttpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:10:10" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00">
                <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
于 2011-11-14T17:11:56.257 回答