asp.net運行原理,筆記

來源:互聯網
上載者:User
asp.net運行原理,筆記中的筆記

當你請求一個包含ASP.NET應用的網址時,IIS接受到請求(IIS是WEB服務守候進程),IIS收到請求後,會根據請求

者請求的主機頭或者IP或者連接埠號碼來找到對應的網站.

IIS
當找到網站後,如果你請求的資源是以ASPX為結尾的WEBFORM,時,IIS會將控制權交給一個ISAPI擴充.,名叫

AspNet_ISAIP.DLL.這時,控制權由IIS交到ASPNET的ISAPI擴充上

ISAPI

能夠處理各種尾碼名的應用程式,通常被稱為 ISAPI 應用程式程式(NOTE:Internet Server Application Programe Interface,互連網伺服器應用程式介面)。雖然這 ISAPI 聽上去還挺氣派,也算是“應用程式”呢,但仔細看看它的全稱就明白了:它實際上只是一個介面,起到一個代理的作用,它的主要工作是映射所請求的頁面(檔案)  和與此尾碼名相對應的實際的處理常式。

ISAPI收到處理請求後,會啟動一個ASP.NET背景工作處理序.然後將要求者的請求資訊轉交給ASP.NET背景工作處理序(名為

ASPNET_WP.EXE).接下來,控制權由ASPNET_WP掌握

ASPNET_WP.EXE,APPDOMAIN
ASPNET_WP首先解出要求者的資訊,如果要求者請求的ASP.NET應用程式(網站或虛擬目錄,通俗一點)尚未擁有

APPDOMAIN,ASPNET_WP就會建立一個APPDOMAIN,並且將被請求的ASP.NET應用所需的Assembly(就是那些DLL,例如

System.Web.DLL等)載入到APPDOMAIN中

當APPDOMAIN初始化完成後,接下來就需要建立會話了吧,因此,請求由HttpRuntime來接受,HttpRunTime主要的工

作便是為每一個提出請求的客戶建立一個HttpContext對象.這個東東又管理著HttpSession對象.每一個訪問者

有各自的HttpContext對象和HttpSession對象

HttpRuntime負責建立HttpContext和HttpSession,httpContext負責管理httpSession

到HttpRuntime建立完httpContext為止,實際上,你的應用程式仍然沒有運行,或者說,要求者的請求實際上並未

真正的被處理,前面的工作都是些準備性或者輔助性的工作.HttpRuntime除了建立上面的對象外,還要建立

HttpApplication.至於建立Application對象的過程,是比較複雜的

接下來,HttpApplication調用ProcessRequest方法來處理使用者請求,此方法會調用對應的HttpHandler來處理使用者請求,HttpHandler根據使用者請求的檔案的副檔名處理請求,並把請求的結果,也就是HTML發送到客戶瀏覽器

 

 

 

利用Http Handler實現防止盜鏈

這2天在看asp.net運行原理

ISAPI,它根據檔案名稱尾碼把不同的請求轉交給不同的處理常式。但是仔細看看就會發現:幾乎一大半的檔案都交給 aspnet_isapi.dll 去處理了。很明顯,aspnet_isapi.dll 不可能對每種檔案採用同一種方式處理,那麼 aspnet_isapi.dll 是如何更進一步處理不同的檔案,交由誰去處理呢?

為了搞清楚這個問題,我們需要開啟機器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目錄下的web.config 檔案。

可以看到,在<httpHandlers>結點中將不同的檔案類型映射給不同的Handler去處理,對於.aspx來說,是由System.Web.UI.PageHandlerFactory來處理。而對於.cs來說,是由System.Web.HttpForbiddenHandler 處理.

如果我們要用編程的方式來操控一個Http請求,我們就需要實現IHttpHandler介面,來定製我們自己的需求。

IHttpHandler要求實現一個方法和一個屬性

下面就是利用實現IHttpHandler來完成防止盜鏈.

 

Code
  public class JpgHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            // 擷取檔案伺服器端實體路徑
            string FileName = context.Server.MapPath(context.Request.FilePath);
            // 如果UrlReferrer為空白,則顯示一張預設的禁止盜鏈的圖片
            if (context.Request.UrlReferrer.Host == null)
            {
                context.Response.ContentType = "image/JPEG";
                context.Response.WriteFile("~/error.jpg");
            }
            else
            {
                // 如果 UrlReferrer中不包含自己網站主機網域名稱,則顯示一張預設的禁止盜鏈的圖片
                if (context.Request.UrlReferrer.Host.IndexOf("localhost") > -1)
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile(FileName);
                }
                else
                {
                    context.Response.ContentType = "image/JPEG";
                    context.Response.WriteFile("~/error.jpg");
                }
            }
        }
        public bool IsReusable
        {
            get { return true; }
        }
    }

 

接著還需要配置webconfig

 

<httpHandlers>
<add verb="*" path="*.jpg" type="WebApplication9.JpgHandler,WebApplication9"/>

 

path指的是請求的檔案名稱,可以使用萬用字元擴大範圍,也可以明確指定這個handler僅用於處理某個特定的檔案(比如說:filename.aspx)的請求。verb指的是請求此檔案的方式,可以是post或get,用*代表所有訪問方式。type屬性由“,”分隔成兩部分,第一部分是實現了介面的類名,第二部分是位於Bin目錄下的編譯過的程式集名稱。

最後還需要去IIS配置jpg的映射,之後就完成了.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.