麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

ASP.NET頁面與IIS底層交互和工作原理詳解(第二回)

2019-11-17 01:33:58
字體:
來源:轉載
供稿:網友

asp.net頁面與IIS底層交互和工作原理詳解(第二回)

引言

在 Part.1Http請求處理流程一文中,我們了解了Http請求的處理過程以及其它一些運作原理。我們知道Http管道中有兩個可用接口,一個是IHttpHandler,一個是IHttpModule,但在Part.1中,我并沒有詳細講述如何對它們進行編程,只是輕描淡寫地一筆帶過。所謂學以致用,前面已經介紹了不少概念和原理。在本文中,我們通過幾個范例來了解 IHttpHandler,看看掌握這些原理的實際用途。

IHttpHandler 概述

可能和我一樣,很多Asp.Net開發人員都有過Asp的背景,以至于我們在開發程序的時候,通常都是在“頁面級”上思考,也就是說我們現在正在做的這個頁面應該有什么樣的功能,是進行一個問卷調查還是一個數據庫查詢等等。而很少在“請求級”思考,考慮有沒有辦法來通過編碼的方式來操控一個Http請求。

實際上,Framework提供了一系列的接口和類,允許你對于Http請求進行編程,而實現這一操作的一個主要的接口,就是 IHttpHandler(另一個是IHttpModule)。

應該還記得第一節中我們提到過 ISAPI,它根據文件名后綴把不同的請求轉交給不同的處理程序。但是仔細看看就會發現:幾乎一大半的文件都交給 aspnet_isapi.dll 去處理了。很明顯,aspnet_isapi.dll 不可能對每種文件采用同一種方式處理,那么 aspnet_isapi.dll 是如何更進一步處理不同的文件,交由誰去處理呢?為了搞清楚這個問題,我們需要打開機器上C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/ 目錄下的web.config 文件。

NOTE我查閱了很多資料,都說是在 machine.config 中,但實際上 v2.0.50727 下的machine.config中httpHandlers結點是這樣的:<httpHandlers />,并沒有給出詳細的處理程序,在Web.config中才能看到。而v1.1.4322 下的machine.config中卻有。

找到httpHandlers結點,應該可以看到如下這樣的代碼(做了省略):

<httpHandlers>... ... //略<add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" /><add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" /> <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" /> <add path="*.asax" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /><add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /> <add path="*.config" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /> <add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" /> <add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" /> ... ... //略</httpHandlers>

可以看到,在<httpHandlers>結點中將不同的文件類型映射給不同的Handler去處理,對于.aspx來說,是由System.Web.UI.PageHandlerFactory來處理。而對于.cs來說,是由System.Web.HttpForbiddenHandler 處理,從ForbiddenHandler名字中出現的Forbidden (翻譯過來是“禁止”)可以看出,這個Handler可以避免我們的源碼被看到。

NOTESystem.Web.UI.PageHandlerFactory 是一個IHttpHandlerFactory,而不是一個單一的HttpHandler,IHttpHandlerFactory用來做什么后面會說明。

上面列出的是.Net Framework在處理Http請求時的所采用的默認Handler。而如果我們要用編程的方式來操控一個Http請求,我們就需要實現IHttpHandler接口,來定制我們自己的需求。

IHttpHandler的定義是這樣的:

public interface IHttpHandler{ void PRocessRequest(HttpContext context); bool IsReusable { get; }}

由上面可以看出IHttpHandler要求實現一個方法和一個屬性。其中 ProcessRequest,從名字(處理請求)看就知道這里應該放置我們處理請求的主要代碼。

IsReusable屬性,MSDN上是這樣解釋的:獲取一個值,該值指示其他請求是否可以使用 IHttpHandler 實例。也就是說后繼的Http請求是不是可以繼續使用實現了該接口的類的實例,一般來說,我把它設置成true。

那么實現此接口的類形式應該是這樣的:

public class CustomHandler : IHttpHandler{ public void ProcessRequest(HttpContext context) { // 處理請求的代碼 } public bool IsReusable { get { return true; } }}

而為了能使用這個自定義的HttpHandler,我們需要在應用程序目錄下的Web.config中注冊它。

<system.web> <httpHandlers> <add path="*.jpg" verb="*" type="MyNameSpace.MyClass, MyDllName" /> </httpHandlers></system.web>

應該發現這與之前在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/CONFIG/目錄下web.config中看到的幾乎完全一樣。這里,path指的是請求的文件名稱,可以使用通配符擴大范圍,也可以明確指定這個handler僅用于處理某個特定的文件(比如說:filename.aspx)的請求。verb指的是請求此文件的方式,可以是post或get,用*代表所有訪問方式。type屬性由“,”分隔成兩部分,第一部分是實現了接口的類名,第二部分是位于Bin目錄下的編譯過的程序集名稱。

NOTE如果你新建一個項目,并且在項目下創建HandlerTest.cs,然后讓站點引用該項目,那么在生成解決方案的時候會自動將編譯好的.dll文件添到Bin目錄中。NOTEMyDll只寫程序集名,不要加后面的.dll。

使用HttpHandler實現圖片防盜鏈

有了之前這么多的準備知識,實現現在的目標就容易得多了:

NOTE這個例子,以及下面的一個例子均來自于《Maximizing ASP.NET Real World, Object-Oriented Development》一書:

Step.1:創建文件 CustomHandler.cs,代碼如下:

using System;using System.Web;namespace CustomHandler{ 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("yourdomain.com") > 0){ 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; } } }}

Step.2 編譯這個文件

csc /t:library /r:System.Web.dll CustomHandler.cs

Step.3 將編譯好的 CustomHandler.dll 拷貝到站點的 Bin 目錄下。

Step.4 Web.Config 中注冊這個Handler

<system.web> <httpHandlers> <add path="*.jpg" verb="*" type="CustomHandler.JpgHandler, CustomHandler" /> </httpHandlers></system.web>

OK,諸位可以按步驟自行測試一下,這里就不贅述了。

通過IhttpHandler實現圖片驗證碼

也可以在一個.ashx文件中實現IHttpHandler,而不是采用這種提前編譯的方式。

Step.1 打開Vs2005添加新項一般處理程序。新建文件后,VS會自動在文件中添加如下的代碼:

<%@ WebHandler Language="C#" class="Handler" %>using System;using System.Web;public class Handler : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } public bool IsReusable { get { return false; } }}

Step.2 將代碼改寫成如下所示:

<%@ WebHandler Language="C#" class="Handler" %>using System;using System.Drawing;using System.Drawing.Imaging;using System.Text;using System.Web;using System.Web.sessionState;public class Handler : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "image/gif"; //建立Bitmap對象,繪圖 Bitmap basemap = new Bitmap(200, 60); Graphics graph = Graphics.FromImage(basemap); graph.FillRectangle(new SolidBrush(Color.White), 0, 0, 200, 60); Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel); Random r = new Random(); string letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ"; string letter; StringBuilder s = new StringBuilder(); //添加隨機的五個字母 for (int x = 0; x < 5; x++) { letter = letters.Substring(r.Next(0, letters.Length - 1), 1); s.Append(letter); graph.DrawString(letter, font, new SolidBrush(Color.Black), x * 38, r.Next(0, 15)); } //混淆背景 Pen linePen = new Pen(new SolidBrush(Color.Black), 2); for (int x = 0; x < 6; x++) graph.DrawLine(linePen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59))); //將圖片保存到輸出流中 basemap.Save(context.Response.OutputStream, ImageFormat.Gif); context.Session["CheckCode"] = s.ToString(); //如果沒有實現IRequiresSessionState,則這里會出錯,也無法生成圖片 context.Response.End(); } public bool IsReusable { get { return true; } }}

需要特別注意的是,Handler類不僅需要實現 IHttpHandler接口(這個顯然),為了在這個Handler類中使用SessionState,還需要實現

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 18欧美性xxxx极品hd | 免费看真人a一级毛片 | 爱操影视| 亚洲精品永久视频 | 91av爱爱| 99999久久久久久 | 成人性生活视频在线播放 | 色99久久 | 黄色一级片免费观看 | 欧美日本不卡 | 91精品国产综合久久婷婷香 | 欧美亚成人 | 亚洲性在线视频 | 亚洲一区二区三区精品在线观看 | 91久久99热青草国产 | 成人午夜视屏 | 韩国草草影院 | 免费网址黄 | 精品一二三区视频 | 西川av在线一区二区三区 | 亚洲5区| 在线免费观看欧美 | h视频在线观看免费 | 双性精h调教灌尿打屁股的文案 | 小视频免费在线观看 | 精品三级内地国产在线观看 | 天堂成人国产精品一区 | 成年人激情在线 | 国产激情网 | 91av资源在线 | 激情小说区 | 久久久久国产成人精品亚洲午夜 | 免费一级欧美大片视频在线 | 久久吊| 欧美一级免费在线观看 | 精品国产一区二区三区四区阿崩 | 成人午夜在线免费观看 | 欧美一级黄视频 | 欧美成人se01短视频在线看 | 91精品国产92久久久久 | 亚洲一区成人 |