2011-04-25 89 views

回答

-2

你可以做的是,在web.config中

<httpRuntime maxRequestLength="11000" /> 

11000 == 11 MB

+0

根據問題 – Onkelborg 2011-04-25 14:07:35

+0

在web.config中無法完成在稍後的 – Ivo 2011-04-25 15:07:09

4

看看http://bytes.com/topic/asp-net/answers/346534-how-i-can-get-httpruntime-section-page

有你如何去HttpRuntimeSection的實例訪問。然後修改屬性MaxRequestLength。

+0

+1中對其進行了編輯。 Btw,PROTIP:不要將null發送給'WebConfigurationManager.OpenWebConfiguration(path)'。 'If null,打開根Web.config'這個句子似乎並不意味着我期望的,我不得不發送「〜」以從根目錄中的web.config中獲取值。 – ANeves 2011-12-14 20:39:47

4

增加最大請求長度的替代方法是創建一個IHttpModule的實現。在BeginRequest處理程序中,獲取HttpWorkerRequest以完全在您自己的代碼中處理它,而不是讓默認實現處理它。

這是一個基本的實現,將處理髮布名爲「dropbox.aspx」的任何文件的任何請求(在任意目錄下,它是否存在與否):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace Example 
{ 
    public class FileUploadModule: IHttpModule 
    { 
     #region IHttpModule Members 

     public void Dispose() {} 

     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += new EventHandler(context_BeginRequest); 
     } 

     #endregion 

     void context_BeginRequest(object sender, EventArgs e) 
     { 
      HttpApplication application = (HttpApplication)sender; 
      HttpContext context = application.Context; 
      string filePath = context.Request.FilePath; 
      string fileName = VirtualPathUtility.GetFileName(filePath); 
      string fileExtension = VirtualPathUtility.GetExtension(filePath); 

      if (fileName == "dropbox.aspx") 
      { 
       IServiceProvider provider = (IServiceProvider)context; 
       HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); 

       //HANDLE REQUEST HERE 
       //Grab data from HttpWorkerRequest instance, as reflected in HttpRequest.GetEntireRawContent method. 

       application.CompleteRequest(); //bypasses all other modules and ends request immediately 
      } 
     } 
    } 
} 

你可以使用類似的東西,例如,如果您正在實施文件上傳器,並且您希望在接收到多部分內容流時處理該內容,則可以根據發佈的表單字段執行身份驗證,更重要的是,可以取消服務器端上的請求甚至在您收到任何文件數據之前。如果您可以在流中儘早確定上傳未被授權,或者該文件太大或超過用戶的Dropbox磁盤配額,則這可以節省大量時間。

這對於默認實現是不可能的,因爲試圖訪問HttpRequest的Form屬性將導致它嘗試接收整個請求流,並完成MaxRequestLength檢查。 HttpRequest對象有一個名爲「GetEntireRawContent」的方法,只要需要訪問內容,該方法就會被調用。該方法開始用下面的代碼:

HttpRuntimeSection httpRuntime = RuntimeConfig.GetConfig(this._context).HttpRuntime; 
int maxRequestLengthBytes = httpRuntime.MaxRequestLengthBytes; 
if (this.ContentLength > maxRequestLengthBytes) 
{ 
    if (!(this._wr is IIS7WorkerRequest)) 
    { 
     this.Response.CloseConnectionAfterError(); 
    } 
    throw new HttpException(SR.GetString("Max_request_length_exceeded"), null, 0xbbc); 
} 

的一點是,你會被跳過的代碼和實現自己的自定義內容長度檢查來代替。如果您使用反射來看看「GetEntireRawContent」使用它作爲一個模型實現的其餘部分,你會看到,它主要執行以下操作:調用GetPreloadedEntityBody,檢查是否有更多的加載通過調用IsEntireEntityBodyIsPreloaded,最後通過調用循環ReadEntityBody獲取剩餘的數據。由GetPreloadedEntityBody和ReadEntityBody讀取的數據被轉儲到一個專用流中,一旦超過大小閾值,該流就會自動使用臨時文件作爲後備存儲。

基本實現應該是這樣的:

MemoryStream request_content = new MemoryStream(); 
int bytesRemaining = wr.GetTotalEntityBodyLength() - wr.GetPreloadedEntityBodyLength(); 
byte[] preloaded_data = wr.GetPreloadedEntityBody(); 
if (preloaded_data != null) 
    request_content.Write(preloaded_data, 0, preloaded_data.Length); 
if (!wr.IsEntireEntityBodyIsPreloaded()) //not a type-o, they use "Is" redundantly in the 
{ 
    int BUFFER_SIZE = 0x2000; //8K buffer or whatever 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    while (bytesRemaining > 0) 
    { 
     bytesRead = wr.ReadEntityBody(buffer, Math.Min(bytesRemaining, BUFFER_SIZE)); //Read another set of bytes 
     bytesRemaining -= bytesRead; // Update the bytes remaining 
     request_content.Write(buffer, 0, bytesRead); // Write the chunks to the backing store (memory stream or whatever you want) 
    } 
    if (bytesRead == 0) //failure to read or nothing left to read 
     break; 
} 

在這一點上,你必須在一個MemoryStream您的整個請求。然而,而不是像下載的整個請求,我所做的是卸載認爲「bytesRemaining」循環成具有「ReadEnough(INT MAX_INDEX)」方法,一類叫做需求從專業化的MemoryStream認爲「負荷不夠」到流中以訪問正被訪問的字節。

最終,該架構允許我直接將請求發送到解析器從存儲器流中讀取,並且根據需要的存儲器流自動從工人請求加載更多的數據。我還實現了事件,以便在解析多部分內容流的每個元素時,會在每個新零件被識別時以及何時完全接收每個零件時觸發事件。