asp.net Forums 之HttpHandler和HttpModule
我们先说说IHttpHandler和IHttpModule这两个接口。
微软的解释为:
IHttpHandler: 定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
IHttpModule: 向继承类提供模块初始化和处置事件。
有点看不懂,微软的解释一向如此。
那我们来看看代码:
public interface IHttpHandler
{
bool IsReusable { get; }
void ProcessRequest(HttpContext context);
}
IsReusable获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
ProcessRequest()方法是处理请求的,System.Web.HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。
public interface IHttpModule
{
void Dispose();
void Init(HttpApplication context);
}
Dispose()方法用于释放资源。
Init()方法初始化这个HttpApplication,你可以在这时注册各类事件,如:Application_BeginRequest,Application_AuthenticateRequest,Application_OnError等。
那IHttpHandler与IHttpModule有什么区别呢:
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的
2.对请求的处理上:
IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,rar,html的请求.
IHttpHandler则属于挑食类型,只有ASP.net注册过的文件类型(例如aspx,asmx等等)才会轮到调用它.
3.IHttpHandler按照你的请求生成响应的内容,IHttpModule对请求进行预处理,如验证、修改、过滤等等,同时也可以对响应进行处理 HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
接下来,我们再来看看ANF中的IHttpModule和IHttpHandler。
ForumsHttpModule类是ANF中自定义的HttpModule,它位于AspNetForums命名空间下。
在这个HttpModule中,自定义了
/// 应用程序初始化
/// </summary>
/// <param name="application"></param>
public void Init(HttpApplication application)
{
// Wire-up application events
//
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
application.AuthenticateRequest += new EventHandler(Application_AuthenticateRequest);
application.Error += new EventHandler(this.Application_OnError);
application.AuthorizeRequest += new EventHandler(this.Application_AuthorizeRequest);
#if DEBUG
application.ReleaseRequestState += new EventHandler(this.Application_ReleaseRequestState);
#endif
ForumConfiguration forumConfig = ForumConfiguration.GetConfig();
if (forumConfig != null
&& forumConfig.IsBackgroundThreadingDisabled == false)
{
if (emailTimer == null)
emailTimer = new Timer(new TimerCallback(ScheduledWorkCallbackEmailInterval), application.Context, EmailInterval, EmailInterval);
if (forumConfig.IsIndexingDisabled == false
&& statsTimer == null)
{
statsTimer = new Timer(new TimerCallback(ScheduledWorkCallbackStatsInterval), application.Context, StatsInterval, StatsInterval);
}
}
}
应用程序错误处理 Application_OnError
{
ForumConfiguration forumConfig = ForumConfiguration.GetConfig();
string defaultLanguage = forumConfig.DefaultLanguage;
HttpApplication application = (HttpApplication) source;
HttpContext context = application.Context;
ForumException forumException;
string html;
StreamReader reader;
// 增加异常信息不同级别显示--开始
// 如果为管理员,显示异常详细信息 by venjiang 2004-11-3
// 发布时注释此代码
// if(Users.GetUser().IsAdministrator)
// {
// context.Response.Write(context.Server.GetLastError().Message);
// return;
// }
// 增加异常信息不同级别显示--结束
if (context.Server.GetLastError().GetBaseException() is ForumException)
{
forumException = (ForumException) context.Server.GetLastError().GetBaseException();
switch (forumException.ExceptionType)
{
case ForumExceptionType.DataProvider:
// We can't connect to the data store
//
reader = new StreamReader(context.Server.MapPath("~/Languages/" + defaultLanguage + "/errors/DataStoreUnavailable.htm"));
html = reader.ReadToEnd();
reader.Close();
html = html.Replace("[DATASTOREEXCEPTION]", forumException.Message);
context.Response.Write(html);
context.Response.End();
break;
case ForumExceptionType.UserInvalidCredentials:
forumException.Log();
break;
case ForumExceptionType.AccessDenied:
forumException.Log();
break;
case ForumExceptionType.AdministrationAccessDenied:
forumException.Log();
break;
case ForumExceptionType.ModerateAccessDenied:
forumException.Log();
break;
case ForumExceptionType.PostDeleteAccessDenied:
forumException.Log();
break;
case ForumExceptionType.PostProblem:
forumException.Log();
break;
case ForumExceptionType.UserAccountBanned:
forumException.Log();
break;
// LN 6/9/04: New exception added
case ForumExceptionType.ResourceNotFound:
//context.Response.Write(context.Server.GetLastError().Message);
forumException.Log();
break;
case ForumExceptionType.UserUnknownLoginError:
forumException.Log();
break;
}
}
else
{
forumException = new ForumException(ForumExceptionType.UnknownError, context.Server.GetLastError().Message, context.Server.GetLastError());
forumException.Log();
}
if (forumException.ExceptionType == ForumExceptionType.UnknownError)
{
if ((context.IsCustomErrorEnabled) && (!context.Request.Url.IsLoopback))
ForumContext.RedirectToMessage(context, forumException);
}
else
{
//context.Response.Write(context.Server.GetLastError().Message);
ForumContext.RedirectToMessage(context, forumException);
}
}
当安全模块已建立用户标识时发生 Application_AuthenticateRequest
{
HttpContext context = HttpContext.Current;
Provider p = null;
ExtensionModule module = null;
// Only continue if we have a valid context
//
if ((context == null) || (context.User == null))
return;
try
{
// Logic to handle various authentication types
//
switch (context.User.Identity.AuthenticationType.ToLower())
{
// Microsoft passport
case "passport":
p = (Provider) ForumConfiguration.GetConfig().Extensions["PassportAuthentication"];
module = ExtensionModule.Instance(p);
module.ProcessRequest();
break;
// Windows
case "negotiate":
p = (Provider) ForumConfiguration.GetConfig().Extensions["WindowsAuthentication"];
module = ExtensionModule.Instance(p);
module.ProcessRequest();
break;
default:
ForumContext.Current.UserName = context.User.Identity.Name;
break;
}
}
catch (Exception ex)
{
ForumException forumEx = new ForumException(ForumExceptionType.UnknownError, "Error in AuthenticateRequest", ex);
forumEx.Log();
throw forumEx;
}
// 获取用户角色
Roles roles = new Roles();
roles.GetUserRoles();
}
验证用户授权 Application_AuthorizeRequest
{
HttpApplication application = (HttpApplication) source;
HttpContext context = application.Context;
// Track anonymous users
//
Users.TrackAnonymousUsers();
// Do we need to force the user to login?
//
if (Users.GetUser().ForceLogin)
{
Moderate.ToggleUserSettings(ModerateUserSetting.ToggleForceLogin, Users.GetUser(), 0);
context.Response.Redirect(Globals.GetSiteUrls().Logout, true);
}
}
响应应用程序请求开始事件 Application_BeginRequest
{
if (HttpContext.Current.Request.Path.IndexOf('\\') >= 0 ||
Path.GetFullPath(HttpContext.Current.Request.PhysicalPath) != HttpContext.Current.Request.PhysicalPath)
{
throw new HttpException(404, "not found");
}
//2005-6-25
//阻止IP访问
//
try
{
HttpApplication application = (HttpApplication) source;
HttpContext context = application.Context;
if (application == null
|| context == null)
return;
// Url Rewriting
string newPath = null;
string path = context.Request.Path;
string query = context.Request.Url.Query;
bool isReWritten = RewriteUrl(path, query, out newPath);
if (isReWritten && newPath != null)
context.RewritePath(newPath);
ForumContext frmContext = CreateForumContext(context);
frmContext.CurrentUrl = context.Request.RawUrl.ToString();
// 2005/04/07
//safe to set url rewrite data;
if (isReWritten && newPath != null)
{
frmContext.IsUrlReWritten = true;
}
// Capture any pingback information
//
CaptureForumPingback();
// Are the forums disabled?
//
if ((Globals.GetSiteSettings().ForumsDisabled) && (HttpContext.Current.Request.Url.Host != "localhost"))
{
ForumConfiguration forumConfig = ForumConfiguration.GetConfig();
string defaultLanguage = forumConfig.DefaultLanguage;
// Forums is disabled
//
StreamReader reader = new StreamReader(context.Server.MapPath("~/Languages/" + defaultLanguage + "/errors/ForumsDisabled.htm"));
string html = reader.ReadToEnd();
reader.Close();
context.Response.Write(html);
context.Response.End();
}
}
catch (Exception ex)
{
ForumException forumEx = new ForumException(ForumExceptionType.UnknownError, "Unknown error in BeginRequest", ex);
forumEx.Log();
}
if (HttpContext.Current.Request.Path.ToLower().IndexOf("msgs/default") < 0)
{
if (BlockedIpAddresses.AddressIsBlocked(Globals.IPAddress))
throw new ForumException(ForumExceptionType.BlockedIpAddress);
}
}
等事件。
在Web.Config文件中配置
<httpModules>
<add name="AspNetForums" type="AspNetForums.ForumsHttpModule, AspNetForums.Components" />
</httpModules>
AvatarHttpHandler类是ANF中的自定义HttpHandler,它位于AspNetForums.Components.HttpHandler命名空间下。
这个HttpHandler主要用于处理用户头像的处理。
{
try
{
Avatar userAvatar = Resources.GetAvatar(int.Parse(context.Request.QueryString["UserID"]));
context.Response.ContentType = userAvatar.ContentType;
context.Response.OutputStream.Write(userAvatar.Content, 0, userAvatar.Length);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
// Terry Denham 7/16/2004
// changing default cache for avatars from 1 day to 30 minutes
context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(10));
context.Response.Cache.SetAllowResponseInBrowserHistory(true);
context.Response.Cache.SetValidUntilExpires(true);
context.Response.Cache.VaryByParams["UserID"] = true;
}
catch
{
}
}
在Web.Config文件中的配置。
<httpHandlers>
<add verb="GET" path="avatar.aspx" type="AspNetForums.Components.HttpHandler.AvatarHttpHandler, AspNetForums.Components" />
<add verb="GET" path="vcard.aspx" type="AspNetForums.Components.HttpHandler.VCardHttpHandler, AspNetForums.Components" />
注: 本文引用了网络上的一些资料。
转载于:https://www.cnblogs.com/Jesong/archive/2010/06/04/1751598.html
asp.net Forums 之HttpHandler和HttpModule相关推荐
- ASP.NET内部原理(HttpHandler和HttpModule)
[IT168 技术文档]在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为 inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请 ...
- Asp.Net Forums研究文章集合(收藏)
Asp.Net Forums研究文章集合 Asp.Net Forums是如何实现代码分离和换皮肤的 http://www.cnblogs.com/dotey/archive/2004/05/28/11 ...
- HttpHandler与HttpModule区别
ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...
- 选择HttpHandler还是HttpModule?
阅读目录 开始 理解ASP.NET管线 理解HttpApplication 理解HttpHandler 理解HttpModule 三大对象的总结 案例演示 如何选择? 最近收到几个疑问:HttpHan ...
- ASP.NET 框架 之HttpHandler
转载: 概述 HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处 ...
- HttpHandler与HttpModule的用处与区别
HttpHandler与HttpModule的用处与区别 问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用Htt ...
- HttpHandler和HttpModule 心得介绍
HttpHandler和HttpModule--入门 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHan ...
- ASP.NET Forums 2.0 本地化修改(四)
ASP.NET Forums 2.0 本地化修改(四) 给编辑器增加支持插入视频.音频.FLASH文件的工具栏...... 转载于:https://www.cnblogs.com/jacky/arch ...
- ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)
学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代码如下 1 <%@ WebHan ...
最新文章
- 华为鸿蒙系统内部消息,华为鸿蒙系统内部曝光,并且将于年底发布?网友:还能再假点?...
- VTK:PolyData之CellCentersDemo
- POJ - 3342 Party at Hali-Bula(树形dp)
- gsonformat插件_收藏非常有用的IDEA插件,没用过这些IDEA插件?怪不得写代码头疼
- antlr4 代码 语法树_使用ANTLR4,用于代码镜像和基于Web的DSL的Primefaces扩展
- C++提高部分_C++类模板成员函数类外实现---C++语言工作笔记092
- 调查:拉丁美洲25%的信用卡用户希望使用加密货币付款
- typeScrip(三) 类
- 类方法load和initialize的区别
- pscad c语言程序,PSCAD入门教程(第8节):调用C语言函数及file reference组件使用...
- 调通sina33m下的AP6212A0版本(分色排版)V1.0版本
- Profinet 协议
- 分区助手扩大c盘后自动修复_怎么使用扩展分区向导来扩大C盘
- 系统完全优化 全面剖析XP
- java实现心型代码
- 油猴加idm不起作用了 油猴加idm下载百度云
- vmware您无权输入许可证密钥,请请使用系统管理员账户重试
- 国外创业者分享之一个iOS游戏赚了多少钱?普通 iOS 应用的收入能否养活自己
- MATLAB读取网页内链接,Matlab使用urlread()读取网页乱码问题
- JAVA课程设计——彩票抽奖购买系统
热门文章
- JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题
- c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
- 三角形css_使用css绘制三角形
- php几大对象,PHP 内部6大对象及其功能
- 关联规则挖掘算法_数据挖掘 | 关联规则分析
- BZOJ-1923-外星千足虫-SDOI2010
- excel取整函数_数据分析小白学习之路(三)——Excel多练熟能生巧
- java spring框架 注解_详解Java的Spring框架中的注解的用法
- 一般服务器崩了要多久能修复,阴阳师服务器崩了修复了吗?阴阳师最新4月15日更新内容...
- 20210831 Ubuntu安装Gnome图形界面