回答
看看http://bytes.com/topic/asp-net/answers/346534-how-i-can-get-httpruntime-section-page
有你如何去HttpRuntimeSection的實例訪問。然後修改屬性MaxRequestLength。
+1中對其進行了編輯。 Btw,PROTIP:不要將null發送給'WebConfigurationManager.OpenWebConfiguration(path)'。 'If null,打開根Web.config'這個句子似乎並不意味着我期望的,我不得不發送「〜」以從根目錄中的web.config中獲取值。 – ANeves 2011-12-14 20:39:47
增加最大請求長度的替代方法是創建一個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認爲「負荷不夠」到流中以訪問正被訪問的字節。
最終,該架構允許我直接將請求發送到解析器從存儲器流中讀取,並且根據需要的存儲器流自動從工人請求加載更多的數據。我還實現了事件,以便在解析多部分內容流的每個元素時,會在每個新零件被識別時以及何時完全接收每個零件時觸發事件。
- 1. 從C#運行C代碼#
- 2. C#,ASP.NET 3.5 - 運行時加載代碼
- 3. vs代碼來運行c代碼
- 4. C++從文件中運行代碼
- 5. 從C++代碼運行可執行jar
- 6. 在C#代碼中增加版本號
- 7. 增加該代碼
- 8. C#上運行的代碼
- 9. C代碼停止運行
- 10. 在線運行C++代碼?
- 11. 用PHP運行C++代碼
- 12. 如何從C#運行PowerShell代碼?
- 13. 從C++代碼運行Python文件
- 14. 從C#運行代碼錯誤的DLL#
- 15. 從C代碼運行64位JVM
- 16. 從bootloader程序運行c代碼
- 17. 如何從終端運行C代碼?
- 18. 在運行時的C#代碼?
- 19. 解決代碼塊在運行時(C#)
- 20. C代碼在運行時崩潰
- 21. 運行時錯誤代碼(C++)
- 22. 從運行C++代碼調用運行Java代碼,反之亦然
- 23. 運行jQuery代碼加載
- 24. 運行代碼
- 25. 運行代碼
- 26. 運行代碼
- 27. 如何添加代碼在運行時
- 28. 加載時代碼不會運行
- 29. 當頁面加載時運行代碼
- 30. 從Java代碼運行Matlab
你有權訪問'machine.config'文件嗎? – 2011-04-25 15:44:36