天天看點

ASP.NET本質論第一章網站應用程式學習筆記2

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

如果您認為這篇文章還不錯或者有所收獲,您可以通過右邊的“打賞”功能 打賞一杯咖啡,本頁版權歸作者和部落格園所有,歡迎轉載,但未經作者同意必須保留此段聲明,

且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利