2009-06-15 84 views
28

我有一個Web服務,需要一個字節[]並保存它。如何將大型(> 25MB)文件上傳到Web服務?

這適用於「小」文件,但一旦達到一定的大小,Web服務將失敗並返回「請求失敗,HTTP狀態404:未找到」。

從我看到的這似乎是一個IIS設置,限制可以發佈的文件的大小(以防止拒絕服務攻擊)。我試圖增加這個設置,但是我很難確定設置和設置的位置。我正在使用IIS7,並且web服務在.net(asmx)中完成。

在我加入下面的Web服務的web.config文件(這似乎增加可以接受的文件的大小,而不是一路此設置大小)

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

任何關於在哪裏(以及如何)增加Web服務文件的大小的建議將不勝感激。

+0

關於WCF/FTP/WS-附件/ DIME:很好的建議和一些有趣的閱讀。這些可能是我最終將使用的長期解決方案的類型。但是,如果有一些短期解決方案用於更改IIS7中的上傳大小,那將非常好。謝謝。 – ChrisHDog 2009-06-16 00:00:09

回答

31

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

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

這似乎是通過網絡服務上傳大文件。

1

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

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

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

+0

我更改爲這些值,結果相同。我從這個(有點相關/有點不相關的)文章中獲取的值:http://support.microsoft.com/kb/925083 - 兩個值集似乎都有相同的問題。 – ChrisHDog 2009-06-15 23:48:40

+0

在接收頁面上設置了什麼ScriptTimeout? – richardtallent 2009-06-16 00:03:45

5

您應該記住,Web服務並非主要設計爲文件傳輸機制。任何目的設計的文件傳輸協議都可能比Web服務做得更好。例如,這些協議更有可能處理錯誤恢復,部分上傳等。

但是,如果您要在.NET中使用Web服務來實現此目的,則應儘可能使用WCF 。除了其他好處之外,WCF還可以處理流式傳輸,因此在內存使用方面效率會更高。我擔心,如果您遵循上述兩個(準確的)建議,那麼您的下一個結果將是「內存不足或資源」異常,因爲舊的ASMX技術會嘗試將整個25MB文件一次加載到內存中。實際上,它可能同時在內存中有多個副本!

1

這並不是專門回答你的問題,但我過去所做的是使用WCF來傳輸文件名/路徑/列表,然後使用FTP庫通過FTP傳輸文件。

3

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

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

我強烈建議reading this.這可能會讓你進入DIME。

這是一段摘錄。

微軟WSE工具包允許使用的DIME和 WS-附件標準 Web服務方法一起發送大附件 。我們將 檢查這些標準,以及爲什麼它們 比通過其他常用 方式發送大量 服務調用中的大量 有效。

希望有所幫助!

+2

準確地說,我正在建議。 XML拒絕服務過濾器將緩衝整個SOAP消息,並且緩衝區大小有限。發送base-64編碼二進制文件作爲附件避免了這一點。 DIME將使Java,PHP和其他客戶端更容易使用該服務。 – 2009-06-15 23:52:55

+4

對不起,但WSE已過時。除非你沒有其他選擇,否則不要使用它。很抱歉,大家都知道,但並非所有人都聽說過在Visual Studio 2008或更高版本中不支持WSE。 – 2009-06-16 00:00:36

5

如果我被困在使用Web服務和需要支持非常大的文件,我會考慮實現一個系統,允許您分片上傳文件。

例如,

  • ticketId GetTicket(大小)
  • UploadData(ticketId,字節[]的有效載荷)(這可以,只要你想叫多次)
  • FinalizeUpload(ticketId)

這允許你組合大量上傳,而不是在內存中保存太多數據。缺點是您仍在使用相當低效的傳輸機制。

5

只是將信息添加到谷歌搜索的人本web.config中:

C:\ Program Files文件\ Common Files文件\ Microsoft共享\ Web服務器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> 

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

0

這個工作對我來說:

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