在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
首先我们来说一下Asp.net工作原理。 复制代码 代码如下:using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Security.Principal; namespace Httplibrary { public class SecurityModules:IHttpModule { public void Init(HttpApplication r_objApplication) { // 向Application 对象注册事件处理程序,核心部分。 r_objApplication.AuthenticateRequest += new EventHandler(this.AuthenticateRequest) ; } public void Dispose() { } private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs) { // 鉴别用户的凭证,并找出用户角色。 HttpApplication objApp = (HttpApplication) r_objSender ; HttpContext objContext = (HttpContext) objApp.Context ; if ( (objApp.Request["userid"] == null) ||(objApp.Request["password"] == null) ) { objContext.Response.Write("用户名和密码为空,验证失败!") ; objContext.Response.End() ; } string userid = "" ; userid = objApp.Request["userid"].ToString() ; string password = "" ; password = objApp.Request["password"].ToString() ; string[] strRoles ; strRoles = AuthenticateAndGetRoles(userid, password) ; if ((strRoles == null) || (strRoles.GetLength(0) == 0)) { objContext.Response.Write("用户名或密码错误!") ; objApp.CompleteRequest() ;//终止一个Http请求 </p> <p>} GenericIdentity objIdentity = new GenericIdentity(userid,"CustomAuthentication") ; objContext.User = new GenericPrincipal(objIdentity, strRoles) ; } private string[] AuthenticateAndGetRoles(string r_strUserID,string r_strPassword) { string[] strRoles = null ; if ((r_strUserID.Equals("Zhangsan")) && (r_strPassword.Equals("111"))) { strRoles = new String[1] ; strRoles[0] = "Administrator" ; } else if ((r_strUserID.Equals("Lisi")) && (r_strPassword.Equals("222"))) { strRoles = new string[1] ; strRoles[0] = "User" ; } return strRoles ; } } } 编译一下,下边做测试页面,很简单,放一个label,text=“测试页面”如果成功则显示测试页面。然后在web.config里面配置,这里很重要。添加 注意注释部分。 复制代码 代码如下:<httpModules> <!--注意我这里的Httplibrary是你添加引用的那个DLL的文件名.Httplibrary.SecurityModules 中前边部分是你那个类的名称空间,后边的是你建的类的名字。--> <add name=" Test1 " type="Httplibrary.SecurityModules,Httplibrary"/> </httpModules> 然后添加 这个节点,这个大家应该都能明白。 <authorization> <deny users="?"/> </authorization> 然后启动测试页面。刚启动开始后页面一定显示“用户名和密码为空,验证失败!”呵呵,别忘记了咱们这就是目的,然后在你的地址栏后边添加?userid= Zhangsan&password=111这行字。然后就会显示“测试页面”这几个字。大家可以多输入几个名字单步调试一下就明白了。 WebConfig设置 复制代码 代码如下:<httpModules> <add type=“classname,assemblyname” name=“modulename”/> <remove name=“modulename”/> <clear/> </httpModules> 子标记说明: <add>将HttpModule 类添加到应用程序。请注意,如果以前已指定了相同的谓词/路径组合(例如在父目录的Web.config 文件中),则对的第二个调用将重写以前的设置。 <remove>从应用程序移除HttpModule 类。 <clear>从应用程序移除所有HttpModule 映射。 深入研究HttpModule HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册,包括: BeginRequest AuthenticateRequest AuthorizeRequest ResolveRequestCache AcquireRequestState PreRequestHandlerExecute PostRequestHandlerExecute ReleaseRequestState UpdateRequestCache EndRequest 我们都可以对以上事件进行重新定义,注意时重新定义不时覆盖。我们看一个例子,多个HttpModule的实现,建立两个类库,什么都相同就是类名不相同,引入相应的命名空间后我们编写这个类,代码如下: 复制代码 代码如下:using System; using System.Collections.Generic; using System.Text; using System.Web; namespace HttpModuleTest1 { public class Test1Module:IHttpModule { public Test1Module() { } public string ModuleName { get { return "Test1Module"; } } public void Init(HttpApplication application) { application.BeginRequest += new EventHandler(myBeginRequest); application.EndRequest += new EventHandler(myEndRequest); application.PreRequestHandlerExecute += new EventHandler(myPreRequestHandlerExecute); application.PostRequestHandlerExecute += new EventHandler(myPostRequestHandlerExecute); application.ReleaseRequestState += new EventHandler(myReleaseRequestState); application.AcquireRequestState += new EventHandler(myAcquireRequestState); application.AuthenticateRequest += new EventHandler(myAuthenticateRequest); application.AuthorizeRequest += new EventHandler(myAuthorizeRequest); application.ResolveRequestCache += new EventHandler(myResolveRequestCache); application.PreSendRequestHeaders += new EventHandler(myPreSendRequestHeaders); application.PreSendRequestContent += new EventHandler(myPreSendRequestContent); } private void myBeginRequest(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Beggining of Request "); } private void myEndRequest(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:End of Request "); } private void myPreRequestHandlerExecute(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_RequestHandlerExecute: "); } private void myPostRequestHandlerExecute(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_PostRequestHandlerExecute: "); } private void myReleaseRequestState(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_ReleaseRequestState: "); } private void myAcquireRequestState(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_ReleaseRequestState: "); } private void myAuthenticateRequest(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_AuthenticateRequest: "); } private void myAuthorizeRequest(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_AuthorizeRequest: "); } private void myResolveRequestCache(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_ResolveRequestCache: "); } private void myPreSendRequestHeaders(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_PreSendRequestHeaders: "); } private void myPreSendRequestContent(object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; context.Response.Write("Test1Module:Application_PreSendRequestContent: "); } public void Dispose() { } } } 然后在web.config里添加,不明白的看注释部分。 复制代码 代码如下:<httpModules> <!--注意我这里的Httplibrary是你添加引用的那个DLL的文件名.Httplibrary.SecurityModules 中前边部分是你那个类的名称空间,后边的是你建的类的名字。--> <add name=" Test1 " type="Httplibrary.SecurityModules,Httplibrary"/> <add name=" MultiTest1 " type="HttpModuleTest1.Test1Module, HttpModuleTest1" /> <add name=" MultiTest2" type="HttpModuleTest2.Test2Module, HttpModuleTest2" /> </httpModules> 还是用刚才那个测试页面,我们就可以观察到两个test的执行顺序。 我们具体分析一下就是这样的: HttpRequest开始->进入HttpModule->HttpModule-> 首次截获HttpRequest->HttpModule.BeginRequest-> HttpModule.AuthorizeRequest->HttpModule.ResolveRequestCache-> 初始化HttpHandler->建立HttpHandler控制点->HttpModule继续处理。HttpHandler已经建立,此后Session可用->HttpModule.AcquireRequestState ->HttpModule.PreRequestHandlerExecute->进入HttpHandler处理HttpRequest ->HttpHandler->HttpHandler.ProcessRequest->返回HttpModule, HttpHandler结束,Session失效->HttpModule.PostRequestHandlerExecute-> HttpModule.ReleaseRequestState-> HttpModule.UpdateRequestCache->HttpModule.EndRequest->HttpModule.PreSendRequestHeaders->HttpModule.PreSendRequestContent-> 将处理的数据返回客户端,处理结束。 HttpHandler: HttpHandler实现了ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。 HTTP处理程序是实现了System.Web.IHttpHandler接口的.NET组件。任何实现了IHttpHandler接口的类都可以用于处理输入的HTTP请求。HTTP处理程序与ISAPI扩展有些类似。HTTP处理程序和ISAPI扩展的差别在于在URL中可以使用HTTP处理程序的文件名称直接调用它们,与ISAPI扩展类似。 HttpHandler的实现,实现我们的HTTP处理程序包含以下步骤: 编写一个实现IHttpHandler接口的类。 在web.config或machine.config文件中注册这个处理程序。 在Internet服务管理器中把文件扩展(你想要处理的文件扩展名)映射到ASP.NETISAPI扩展DLL(aspnet_isapi.dll)上。 我们来看一个例子,打开IIS服务器,属性,主目录下有个配置,里面你就可以找到你的程序所执行文件所要调用的.dll文件。我们可以看到.aspx就是 C:WINDOWSMicrosoft.NETFramework 2.0.50727aspnet_isapi.dll这个文件 来执行的。这里还可以添加你自己任意定义任意扩展名文件,定义了后你的服务器就可以认识这些人间,注意只是你的服务器,别人的不认识。这时候大家就会对网络上流行的各式各样的后缀名不奇怪了吧,可以自己定义的。 我们自己定义一个带.xxx后缀的。 添加一个类库,引用的相应的命名空间, 复制代码 代码如下:using System; using System.Collections.Generic; using System.Text; using System.Web; namespace MyHandler { public class NewHandler:IHttpHandler { public NewHandler() { // TODO: 此处添加构造逻辑 } Implementation of IHttpHandler#region Implementation of IHttpHandler /**//// <summary> /// http处理程序的核心。我们调用这个方法来处理http请求。 /// </summary> /// <param name="context"></param> public void ProcessRequest(System.Web.HttpContext context) { HttpResponse objResponse = context.Response; objResponse.Write("<html><body><h1>Hello xxx ! "); objResponse.Write("</body></html>"); } /**//// <summary> /// 我们调用这个属性来决定http处理程序的实例是否可以用于处理相同其它类型的请求。 /// HTTP处理程序可以返回true或false来表明它们是否可以重复使用。 /// </summary> public bool IsReusable // { get { return true; } } #endregion } } 然后再web.config里面配置相应节点:这里不懂的参考前边的,XXX就是我们刚才定义那个后缀名。 <httpHandlers> <add verb="*" path="*.xxx" type="MyHandler.NewHandler,MyHandler" /> </httpHandlers> 然后添加一个测试页面,就可以了。 HttpHandler之间的关系是这样的: 发送一个Http请求,然后判断是否存在自定义的HttpHandler,如果存在的话由自定义的HttpHandler处理Http请求,否则由系统默认的HttpHandler处理Http请求。 在HttpHandler中访问Session: 不能直接通过HttpContext访问。 必须实现IRequiresSessionState接口。 IRequiresSessionState接口指定目标HTTP处理程序接口具有对会话状态值的读写访问权限。这是一个标记接口,没有任何方法。 怎样实现呢,我们还是来看例子吧:添加类库,引用相应的命名空间。 复制代码 代码如下:using System; using System.Web; using System.Web.SessionState; namespace MyHandler { public class NewHandlerSession : IHttpHandler,IRequiresSessionState { public NewHandlerSession() { // TODO: 此处添加构造逻辑 } Implementation of IHttpHandler#region Implementation of IHttpHandler /**//// <summary> /// http处理程序的核心。我们调用这个方法来处理http请求。 /// </summary> /// <param name="context"></param> public void ProcessRequest(System.Web.HttpContext context) { HttpResponse objResponse = context.Response ; HttpRequest objRequest = context.Request; HttpSessionState objSession = context.Session; objResponse.Write("欢迎使用自定义HttpHandler! "); objSession["Test"] = "Session 测试! "; objResponse.Write("Session的值为:"+objSession["Test"].ToString()); } /**//// <summary> /// 我们调用这个属性来决定http处理程序的实例是否可以用于处理相同其它类型的请求。 /// HTTP处理程序可以返回true或false来表明它们是否可以重复使用。 /// </summary> public bool IsReusable // { get { return true; } } #endregion } } 然后配置Web.config的节点: 复制代码 代码如下:<httpHandlers> <!--<add verb="*" path="*.xxx" type="MyHandler.NewHandler,MyHandler" />--> <add verb="*" path="*" type="MyHandler.NewHandlerSession,MyHandlerSession" /> </httpHandlers> 这样就可以了。 ASP.NET事件模型机制: ASP.NET之所以对于以前的ASP是一个革命性的巨变,在很大程度上是由于ASP.NET技术是一种完全基于事件驱动的全新技术。 在ASP.NET中事件的触发和处理分别是在客户端和服务器段进行的。 ASP.NET中,如果频繁和服务器进行事件信息的传递,会大大降低服务器的处理效率和性能,因而有些事件如OnMouseOver没有提供。 但提供了Change事件。为了提高效率它们被缓存在客户端。等到再一次事件信息被发送到服务器端时一同发送回去。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论