簡體   English   中英

如何將大型(> 25MB)文件上載到Web服務?

[英]How do I upload large (> 25MB) files to a web service?

我有一個Web服務,它接受一個byte []並保存它。

這適用於“小”文件,但是一旦我達到一定的大小,Web服務就會失敗並返回“請求失敗,HTTP狀態為404:未找到”。

從我所看到的,這似乎是一個IIS設置,限制了可以發布的文件的大小(以防止拒絕服務攻擊)。 我試圖增加該設置,但我無法確定設置的位置以及設置的位置和方式。 我正在使用IIS7,而web服務是在.net(asmx)中完成的。

在Web服務的web.config中,我添加了以下內容(這似乎增加了可以接受的文件大小,但不是一直到這個設置大小)

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

有關增加Web服務的文件大小的位置(以及如何)的任何建議將非常感激。

除了問題中提到的httpRuntime / maxRequestLength之外,看起來還有一個附加項可以添加到Web服務的web.config文件中以允許大文件傳輸。

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

這似乎可以通過Web服務上傳更大的文件。

只是為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>

這解決了我們在解決這個問題很長時間之后的問題。

您應該記住,Web服務主要不是設計為文件傳輸機制。 任何專門設計的文件傳輸協議都可能比Web服務做得更好。 例如,此類協議更有可能處理錯誤恢復,部分上傳等。

但是,如果您要在.NET中為此目的使用Web服務,則應盡可能使用WCF。 除了其他好處之外,WCF處理流式傳輸,因此在內存使用方面會更高效。 我擔心如果你遵循上面的兩個(准確的)建議,你的下一個結果將是“內存或資源不足”的異常,因為舊的ASMX技術試圖一次將整個25MB文件加載到內存中。 事實上,它可能同時在內存中有幾個副本!

如果我不得不使用Web服務並且需要支持非常大的文件,我會考慮實現一個允許您分段上傳文件的系統。

例如。

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

這將允許您對大型上傳進行分塊,而不是在內存中保留太多數據。 缺點是您仍然使用相當低效的傳輸機制。

如果你開始使用Web服務來移動文件,我至少會考慮使用WS-Attachment / DIME附件。 通過Web服務發送byte []的主要問題是它們被放入SOAP主體中,該主體被編碼為基本64字符串。 像這樣編碼文件會使文件的大小增加多達肥皂體中的三分之二(即6 MB文件通過網絡成為9 MB文件)。

你的25 MB上傳可能會變成巨大的肥皂信封。

我強烈建議閱讀這篇文章。 這可能會讓你進入DIME。

這是一段摘錄。

Microsoft的WSE Toolkit允許使用DIME和WS-Attachments標准將大型附件與Web服務方法一起發送。 我們將研究這些標准以及為什么它們比通過其他常用方法在Web服務調用中發送大量二進制數據更有效。

希望有所幫助!

maxRequestLength以KB為單位,而不是字節。 這應該在4分鍾的超時窗口內給你30 MB的限制。

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

數字太高可能實際上阻止了您的值被應用。 我幾年前遇到過這種情況,當時我認為這是一個字節限制(模糊內存)。

這並沒有具體回答你的問題,但我過去所做的是使用WCF傳輸文件名/路徑/列表,然后使用FTP庫通過FTP傳輸文件。

這對我有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM