1.初步走進ASP.NET
上篇筆記我們講述了伺服器監聽問題,這篇我們就要講述具體的請求處理了,ASP.NET所涉及的類大多數定義在System.Web程式集中。
在.NET中,程式集管理的最小邏輯機關為:應用程式域(AppDomain),對于.NET程式來說,可以動态加載程式集到應用程式域中,但是加載之後的程式集不能單獨解除安裝,隻能以應用程式域為機關整體來解除安裝,應用程式域提供了四個重要的機制:
1) 隔離,不同應用程式域之間不能直接通路,跨應用程式域通路的對象必須派生自System.MarshalByRefObject。
2) 解除安裝,被加載的程式集隻能以應用程式域為機關解除安裝
3) 安全,以應用程式域為邊界的安全機制
4) 配置,以應用程式域為邊界的程式配置
由于我們的應用程式将于Web應用程式運作子不同的應用程式域中,這就是涉及到了跨域的問題,在.NET中,跨域通路的類必須繼承自System.MarshalByRefObject。
2.Web應用程式域
ApplicationHost類的靜态方法CreateApplicationHost可以幫助我們建立Web應用程式所需要的應用程式域,并設定所有需要的參數,方法定義如下:
public static Object CreateApplicationHost(Type hostType,string virtualDir,string physicalDir);
注解:hostType:表示用來跨域通路的通信對象,他必須派生自MarshalByRefObject基類。virtualDir:表示是網站應用程式域的跟所對應的虛拟目錄。physicalDir:表示網站應用程式所在的檔案系統的檔案目錄。
下面的例子示範了借助于ApplicationHost類建立新的應用程式域的過程:
1 private static void Main(string[] args)
2 {
3 Type hostType = typeof (Intelligencer);
4 Intelligencer intelligencer =
5 System.Web.Hosting.ApplicationHost.CreateApplicationHost(hostType, "/",
6 System.Environment.CurrentDirectory) as
7 Intelligencer;
8 Console.WriteLine("Current Domian ID:{0}\r\n", AppDomain.CurrentDomain.Id);
9 Console.WriteLine(intelligencer.Report());
10 Console.ReadLine();
11 }
12 public class Intelligencer : MarshalByRefObject
13 {
14 public string Report()
15 {
16 AppDomain appDomain = AppDomain.CurrentDomain;
17 StringBuilder builder = new StringBuilder();
18 //應用程式域的資訊
19 builder.AppendFormat("Domain ID:{0}\r\n", appDomain.Id);
20 //對于每一個Web應用程式域,有一個HostingEncironment
21 builder.AppendFormat("VirtualPath:{0}\r\n", HostingEnvironment.ApplicationVirtualPath);
22 builder.AppendFormat("PhysicalPath:{0}\r\n", HostingEnvironment.ApplicationPhysicalPath);
23 return builder.ToString();
24 }
25 }
3.不使用GAC和bin加載Web應用程式域
使用ApplicationHost建立應用程式域有一點麻煩的地方在于,必須将程式集注冊到GAC中,或者複制到bin檔案夾下,在Cassini項目中提供了一種可以在單個超過您續重實作的方式,代碼如下:
1 private static object CreateWorkerAppDomianWithHost(string virtualPath, string physicalPath, Type hostType)
2 {
3 //通過反射使用私有的BuildMangeHost類型,這種方式建立web應用程式域,不需程式集注冊到GAC或者放置到bin檔案夾
4 //唯一的應用程式名
5 string uniqueAppString = string.Concat(virtualPath, physicalPath.ToLowerInvariant());
6 //擷取唯一的Id
7 string appId = (uniqueAppString.GetHashCode()).ToString("x");
8 //在Web應用程式域中建立BuildManagerHost
9 var appManager = ApplicationManager.GetApplicationManager();
10 //System.Web.Compilation.BuildMangerHost是一個内部類,不能再CSDN查到
11 var buildManagerHostType = typeof (HttpRuntime).Assembly.GetType("System.Web.Compilation.BuildMangerHos");
12 //為應用程式域建立對象
13 var buildManagerHost = appManager.CreateObject(appId, buildManagerHostType, virtualPath, physicalPath, false);
14 //調用BuildManagerHost.RegisterAssembly方法将類型注冊到應用程式域
15 buildManagerHostType.InvokeMember("RegisterAssembly",
16 BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.NonPublic,
17 null, buildManagerHost, new object[2]
18 {
19 hostType.Assembly.FullName,
20 hostType.Assembly.Location
21 });
22 //現在可以使用類型建立對象執行個體
23 return appManager.CreateObject(appId, hostType, virtualPath, physicalPath, false);
24 }
4.ASP.NET工作者對象
1) ASP.NET中,準備用于處理的請求,必須封裝為HttpWorkerRequest類型的對象,這是一個抽象類,定義在System.Web命名空間中,類型定義如下:
[ComvisibleAttribute(false)]
public abstract class HttpWorkRequest
2) HttpWorkRequst中的成員含有:網址:http://msdn.microsoft.com/zh-cn/library/system.web.httpworkerrequest(v=vs.110).aspx
3) httpWorkRequest解決大檔案上傳
借助于HttpWorkRequest的GetPreLoadedEntityBody和ReadEntityBody方法,我們可以分塊的從用戶端讀取上傳的檔案内容,然後,将内容儲存在一個臨時檔案夾中。
案例位址:a:http://slickupload.com/
b:http://www.cnblogs.com/wucountry/archive/2005/12/28/306725.html
4.Web應用程式運作時
1) System.Web.HttpRuntime類是整個ASP.NET伺服器處理的入口,參考資料:
http://msdn.microsoft.com/zh-cn/library/system.web.httpruntime(v=vs.110).aspx
2) HttpRuntime的靜态方法ProcessRequest将幫助我了解HTTP,方法的定義如下:
public static void ProcessRequest(HttpWorkerRequest wr)
3) 将HttpWorkerRequest對象傳遞給ProcessRequest方法,ASP.NET就開始伺服器的請求處理任務了。
初心商城:初心商城
作者:韓迎龍(Kencery) MVC/.NET群:159227188
如果您認為這篇文章還不錯或者有所收獲,您可以通過右邊的“打賞”功能 打賞一杯咖啡,本頁版權歸作者和部落格園所有,歡迎轉載,但未經作者同意必須保留此段聲明,
且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利