最近在学并想些点关于HTTP处理的东西,偶然看到 文野 兄的系列文章 《一点一点学ASP.NET之基础概念——HttpHandler 》《一点一点学ASP.NET之基础概念——HttpModule 》 文章写得深入浅出 通俗易懂。戏水遂不敢狗尾续貂 只从msdn摘抄些文字,方便查阅。另附学习后的实践作品一个------防盗链模块 的简单实现 ,希望过路的神仙多给宝贵意见,善哉!
BeginRequest | 此事件标志着这是一个新请求;每个请求都必须产生该事件 | ||
AuthenticateRequest | 此事件标志着所配置的身份验证机制已经验证了请求。附加到此事件可向筛选器确保请求已通过身份验证 | ||
AuthorizeRequest | 与 AuthenticateRequest 一样,此事件标志着现在请求在处理过程中又前进了一步,并且请求已经得到授权 | ||
ResolveRequestCache | 输出缓存模块使用此事件来简化对已经缓存的请求所进行的处理 | ||
AcquireRequestState | 此事件标志着应该获得各个请求状态 | ||
PreRequestHandlerExecute | 此事件标志着请求处理程序将要执行。这是在调用此请求的 HTTP 处理程序之前您可以参与的最后一个事件 |
下一个列表显示了处理请求之后产生的事件。这些事件是按照发生的顺序列出的:
•PostRequestHandlerExecute |
. 此事件标志着 HTTP 处理程序已经完成了对请求的处理。 |
•ReleaseRequestState |
. 此事件标志着应该存储请求状态,因为应用程序已经完成了对请求的处理。 |
•UpdateRequestCache |
. 此事件标志着代码处理已完成,可以将文件添加到 ASP.NET 缓存中。 |
•EndRequest |
. 此事件标志着已完成对请求的所有处理。这是应用程序结束时所调用的最后一个事件。 |
此外,以下三个请求处理前事件可以按不确定顺序引发:
•PreSendRequestHeaders |
.此事件标志着 HTTP 头将要发送给客户端。因此可以在发送之前添加、删除或修改头信息。 |
•PreSendRequestContent |
. 此事件标志着内容将要发送给客户端。这为发送之前修改内容提供了一个机会。 |
•Error |
. 此事件标志着有未处理的异常。 |
源代码
1using System;
2using System.IO;
3using System.Collections;
4using System.Collections.Generic;
5using System.Text;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.Configuration;
11
12namespace CheckDown
13{
14 public class CheckDown:IHttpHandler
15 {
16 IDictionary<string, string> mimeTypeList = null;
17 string strAllowHost = string.Empty; //本站 host 用户检验请求是否合法
18 string strErrorFileName =string.Empty; //非法请求的时候返回的文件
19 string strErrorFileType = string.Empty; //非法请求返回的文件的mime类型
20 string strMimeType = string.Empty; //请求文件的mime类型
21 string strFileName = string.Empty; //请求的文件名
22
23 public void ProcessRequest(HttpContext context)
24 {
25 if (mimeTypeList == null)
26 {
27 mimeTypeList = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
28 mimeTypeList.Add("doc", "application/msword");
29 mimeTypeList.Add("pdf", "application/pdf");
30 mimeTypeList.Add("xls", "application/vnd.ms-excel");
31 mimeTypeList.Add("ppt", "application/vnd.ms-powerpoint");
32 mimeTypeList.Add("swf", "application/x-shockwave-flash");
33 mimeTypeList.Add("zip", "application/zip");
34 mimeTypeList.Add("rar", "application/x-rar-compressed");
35 mimeTypeList.Add("htm", "text/html");
36 }
37
38
39 strFileName = context.Server.MapPath(context.Request.FilePath); //客户端请求的文件
40 //在webconfig <appSettings> 增加 <add key="CheckDown_AllowHost" value=""/>
41 strAllowHost = WebConfigurationManager.AppSettings["CheckDown_AllowHost"];
42 //<add key="CheckDown_ErrorFileName" value="~/Path/error.html"/>
43 strErrorFileName = context.Server.MapPath(WebConfigurationManager.AppSettings["CheckDown_ErrorFileName"]);
44 //<add key="CheckDown_ErrorFileType" value="text/html"/>
45 strErrorFileType = WebConfigurationManager.AppSettings["CheckDown_ErrorFileType"];
46
47 //取得文件扩展名
48 int intExt = strFileName.LastIndexOf(".")+1;
49 string strFileExt = strFileName.Substring(intExt); //取得文件扩展名
50 if (mimeTypeList.ContainsKey(strFileExt))
51 {
52 strMimeType = mimeTypeList[strFileExt];
53 }
54 else
55 {
56 strMimeType="application/octet-stream";
57 }
58
59 if (context.Request.Url.Host == null) //非法访问
60 {
61 context.Response.ContentType = strErrorFileType;
62 context.Response.WriteFile(strErrorFileName);
63 }
64 else
65 {
66 //如果是本站访问下载 合法
67 if (context.Request.Url.Host.IndexOf(strAllowHost) != -1)
68 {
69 context.Response.ContentType = strMimeType;
70 context.Response.WriteFile(strFileName);
71 }
72 else //非法访问
73 {
74 context.Response.ContentType = strErrorFileType;
75 context.Response.WriteFile(strErrorFileName);
76 }
77 }
78 }//ProccessRequest
79
80 public bool IsReusable
81 {
82 get { return true; }
83 }
84 }
85}
86
1using System;
2using System.IO;
3using System.Collections;
4using System.Collections.Generic;
5using System.Text;
6using System.Web;
7using System.Web.Security;
8using System.Web.UI;
9using System.Web.UI.WebControls;
10using System.Web.Configuration;
11
12namespace CheckDown
13{
14 public class CheckDown:IHttpHandler
15 {
16 IDictionary<string, string> mimeTypeList = null;
17 string strAllowHost = string.Empty; //本站 host 用户检验请求是否合法
18 string strErrorFileName =string.Empty; //非法请求的时候返回的文件
19 string strErrorFileType = string.Empty; //非法请求返回的文件的mime类型
20 string strMimeType = string.Empty; //请求文件的mime类型
21 string strFileName = string.Empty; //请求的文件名
22
23 public void ProcessRequest(HttpContext context)
24 {
25 if (mimeTypeList == null)
26 {
27 mimeTypeList = new Dictionary<string, string>(StringComparer.CurrentCultureIgnoreCase);
28 mimeTypeList.Add("doc", "application/msword");
29 mimeTypeList.Add("pdf", "application/pdf");
30 mimeTypeList.Add("xls", "application/vnd.ms-excel");
31 mimeTypeList.Add("ppt", "application/vnd.ms-powerpoint");
32 mimeTypeList.Add("swf", "application/x-shockwave-flash");
33 mimeTypeList.Add("zip", "application/zip");
34 mimeTypeList.Add("rar", "application/x-rar-compressed");
35 mimeTypeList.Add("htm", "text/html");
36 }
37
38
39 strFileName = context.Server.MapPath(context.Request.FilePath); //客户端请求的文件
40 //在webconfig <appSettings> 增加 <add key="CheckDown_AllowHost" value=""/>
41 strAllowHost = WebConfigurationManager.AppSettings["CheckDown_AllowHost"];
42 //<add key="CheckDown_ErrorFileName" value="~/Path/error.html"/>
43 strErrorFileName = context.Server.MapPath(WebConfigurationManager.AppSettings["CheckDown_ErrorFileName"]);
44 //<add key="CheckDown_ErrorFileType" value="text/html"/>
45 strErrorFileType = WebConfigurationManager.AppSettings["CheckDown_ErrorFileType"];
46
47 //取得文件扩展名
48 int intExt = strFileName.LastIndexOf(".")+1;
49 string strFileExt = strFileName.Substring(intExt); //取得文件扩展名
50 if (mimeTypeList.ContainsKey(strFileExt))
51 {
52 strMimeType = mimeTypeList[strFileExt];
53 }
54 else
55 {
56 strMimeType="application/octet-stream";
57 }
58
59 if (context.Request.Url.Host == null) //非法访问
60 {
61 context.Response.ContentType = strErrorFileType;
62 context.Response.WriteFile(strErrorFileName);
63 }
64 else
65 {
66 //如果是本站访问下载 合法
67 if (context.Request.Url.Host.IndexOf(strAllowHost) != -1)
68 {
69 context.Response.ContentType = strMimeType;
70 context.Response.WriteFile(strFileName);
71 }
72 else //非法访问
73 {
74 context.Response.ContentType = strErrorFileType;
75 context.Response.WriteFile(strErrorFileName);
76 }
77 }
78 }//ProccessRequest
79
80 public bool IsReusable
81 {
82 get { return true; }
83 }
84 }
85}
86