ASP NET架构及开发技术详解教程.docx
- 文档编号:4042430
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:14
- 大小:21.16KB
ASP NET架构及开发技术详解教程.docx
《ASP NET架构及开发技术详解教程.docx》由会员分享,可在线阅读,更多相关《ASP NET架构及开发技术详解教程.docx(14页珍藏版)》请在冰豆网上搜索。
ASPNET架构及开发技术详解教程
ASPNET架构及开发技术详解教程
ASP.NET架构及开发技术详解教程
首先我们来说一下Asp.工作原理。
具体描述下这样的:
首先客户请求WEB页。
然后WEB效劳寻找指令文件(.aspx),而这时就是aspisapi.dll这个动态连接库来处理。
接着Asp.代码被发送到公共语言运行时进行编译。
接着HTML流返回给浏览器和令。
最后由浏览器处理HTML并显示页面。
什么是ISAPI呢?
在Inter时代的开端,客户端的需求非常有限;.htm文件就可以满足他们的需求。
但是,随着时间的流逝,客户端需求的扩充超越了.htm文件或静态文件所包含的功能。
开发者需要扩充或扩展Web效劳器的功能。
Web效劳器厂商设计了不同的解决方案,但是都遵循同一个主题“向Web效劳器插入某些组件”。
所有的Web效劳器补充技术都允许开发者建立并插入组件以增强Web效劳器的功能。
微软公司提出了ISAPI(Inter效劳器API),网景公司提出了NSAPI(网景效劳器API)等等。
ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的Web效劳器(IIS就是一种与ISAPI兼容的Web效劳器)的能力。
我们使用下面的组件到达这个目的:
1,ISAPI扩展:
ISAPI扩展是使用Win32动态链接库来实现的。
你可以把ISAPI扩展看作是一个普通的应用程序。
ISAPI扩展的处理目标是请求。
2,ISAPI过滤器:
客户端每次向效劳器发出请求的时候,请求要经过过滤器。
客户端不需要在请求中指定过滤器,只需要简单地把请求发送给Web效劳器,接着Web效劳器把请求传递给相关的过滤器。
接下来过滤器可能修改请求,执行某些操作等等。
ASP.NET请求的处理过程:
ASP.NET请求处理过程是基于管道模型的,在模型中ASP.NET把请求传递给管道中的所有模块。
每个模块都接收请求并有完全控制权限。
模块可以用任何自认为适合的方式来处理请求。
一旦请求经过了所有模块,就最终被处理程序处理。
处理程序对请求进行一些处理,并且结果将再次经过管道中模块。
ISAPI的筛选器:
IIS本身是不支持动态页面的,也就是说它仅仅支持静态html页面的内容,对于如.asp,.aspx,.cgi,.php等,IIS并不会处理这些标记,它就会把它当作文本,丝毫不做处理发送到客户端。
为了解决这个问题。
IIS有一种机制,叫做ISAPI的筛选器,它是一个标准组件(组件)。
Asp.效劳在到IIS的时候,会把每个扩展可以处理的文件扩展名到IIS里面(如:
*.ascx、*.aspx等)。
扩展启动后,就根据定义好的方式来处理IIS所不能处理的文件,然后把控制权跳转到专门处理代码的进程中让这个进程开始处理代码,生成标准的HTML代码,生成后把这些代码参加到原有的Html中,最后把完整的Html返回给IIS,IIS再把内容发送到客户端。
HttpModule:
HttpModule实现了ISAPIFilter的功能,是通过对IModule接口的继承来处理。
模块是实现了System.Web.IModule接口的.NET组件。
这些组件通过在某些事件中自身,把自己插入ASP.NET请求处理管道。
当这些事件发生的时候,ASP.NET调用对请求有兴趣的模块,这样该模块就能处理请求了。
HttpModule的实现:
1.编写一个类,实现IModule接口。
2.实现Init方法,并且需要的方法。
3.实现的方法。
4.实现Dispose方法,如果需要手工为类做一些去除工作,可以添加Dispose方法的实现,但这不是必需的,通常可以不为Dispose方法添加任何代码。
5.在Web.config文件中,您编写的类。
下边我们来看例子,HttpModule的实现:
首先添加一个类库,然后在引用里引用System.Web和System.Security这两个命名空间。
然后写个类,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web;
usingSystem.Security.Principal;
namespaceHttplibrary
{
publicclassSecurityModules:
IHttpModule
{
publicvoidInit(HttpApplicationrobjApplication)
{
//向Application对象事件处理程序,核心局部。
robjApplication.AuthenticateRequest+=newEventHandler(this.AuthenticateRequest);
}
publicvoidDispose()
{
}
privatevoidAuthenticateRequest(objectrobjSender,EventArgsrobjEventArgs)
{
//鉴别用户的凭证,并找出用户角色。
HttpApplicationobjApp=(HttpApplication)robjSender;
HttpContextobjContext=(HttpContext)objApp.Context;
if((objApp.Request["userid"]==null)||(objApp.Request["password"]==null))
{
objContext.Response.Write("用户名和密码为空,验证失败!
");
objContext.Response.End();
}
stringuserid="";
userid=objApp.Request["userid"].ToString();
stringpassword="";
password=objApp.Request["password"].ToString();
string[]strRoles;
strRoles=AuthenticateAndGetRoles(userid,password);
if((strRoles==null)||(strRoles.GetLength(0)==0))
{
objContext.Response.Write("用户名或密码错误!
");
objApp.CompleteRequest();//终止一个Http请求
}
GenericIdentityobjIdentity=newGenericIdentity(userid,"CustomAuthentication");
objContext.User=newGenericPrincipal(objIdentity,strRoles);
}
privatestring[]AuthenticateAndGetRoles(stringrstrUserID,stringrstrPassword)
{
string[]strRoles=null;
if((rstrUserID.Equals("Zhangsan"))&&(rstrPassword.Equals("111")))
{
strRoles=newString[1];
strRoles[0]="Administrator";
}
elseif((rstrUserID.Equals("Lisi"))&&(rstrPassword.Equals("222")))
{
strRoles=newstring[1];
strRoles[0]="User";
}
returnstrRoles;
}
}
}
编译一下,下边做测试页面,很简单,放一个label,text=“测试页面”如果成功那么显示测试页面。
然后在web.config里面配置,这里很重要。
添加注意注释局部。
然后添加这个节点,这个大家应该都能明白。
然后启动测试页面。
刚启动开始后页面一定显示“用户名和密码为空,验证失败!
”呵呵,别忘记了咱们这就是目的,然后在你的地址栏后边添加?
userid=Zhangsan&password=111这行字。
然后就会显示“测试页面”这几个字。
大家可以多输入几个名字单步调试一下就明白了。
WebConfig设置
name=“modulename”/>
子标记说明:
将HttpModule类添加到应用程序。
请注意,如果以前已指定了相同的谓词/路径组合(例如在父目录的Web.config文件中),那么对的第二个调用将重写以前的设置。
从应用程序移除HttpModule类。
从应用程序移除所有HttpModule映射。
深入研究HttpModule
HttpModule通过对HttpApplication对象的一系列事件的处理来对处理管道施加影响,这些事件在HttpModule的Init方法中进行,包括:
BeginRequest
AuthenticateRequest
AuthorizeRequest
ResolveRequestCache
AcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
UpdateRequestCache
EndRequest
我们都可以对以上事件进行重新定义,注意时重新定义不时覆盖。
我们看一个例子,多个HttpModule的实现,建立两个类库,什么都相同就是类名不相同,引入相应的命名空间后我们编写这个类,代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Web;
namespaceHttpModuleTest1
{
publicclassTest1Module:
IHttpModule
{
publicTest1Module()
{
}
publicstringModuleName
{
get
{
return"Test1Module";
}
}
publicvoidInit(HttpApplicationapplication)
{
application.BeginRequest+=newEventHandler(myBeginRequest);
application.EndRequest+=newEventHandler(myEndRequest);
application.PreRequestHandlerExecute+=newEventHandler(myPreRequestHandlerExecute);
application.PostRequestHandlerExecute+=newEventHandler(myPostRequestHandlerExecute);
application.ReleaseRequestState+=newEventHandler(myReleaseRequestState);
application.AcquireRequestState+=newEventHandler(myAcquireRequestState);
application.AuthenticateRequest+=newEventHandler(myAuthenticateRequest);
application.AuthorizeRequest+=newEventHandler(myAuthorizeRequest);
application.ResolveRequestCache+=newEventHandler(myResolveRequestCache);
application.PreSendRequestHeaders+=newEventHandler(myPreSendRequestHeaders);
application.PreSendRequestContent+=newEventHandler(myPreSendRequestContent);
}
privatevoidmyBeginRequest(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
BegginingofRequest
");
}
privatevoidmyEndRequest(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
EndofRequest
");
}
privatevoidmyPreRequestHandlerExecute(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationRequestHandlerExecute:
");
}
privatevoidmyPostRequestHandlerExecute(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationPostRequestHandlerExecute:
");
}
privatevoidmyReleaseRequestState(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationReleaseRequestState:
");
}
privatevoidmyAcquireRequestState(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationReleaseRequestState:
");
}
privatevoidmyAuthenticateRequest(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationAuthenticateRequest:
");
}
privatevoidmyAuthorizeRequest(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationAuthorizeRequest:
");
}
privatevoidmyResolveRequestCache(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationResolveRequestCache:
");
}
privatevoidmyPreSendRequestHeaders(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationPreSendRequestHeaders:
");
}
privatevoidmyPreSendRequestContent(objectsource,EventArgse)
{
HttpApplicationapplication=(HttpApplication)source;
HttpContextcontext=application.Context;
context.Response.Write("Test1Module:
ApplicationPreSendRequestContent:
");
}
publicvoidDispose()
{
}
}
}
然后在web.config里添加,不明白的看注释局部。
还是用刚刚那个测试页面,我们就可以观察到两个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实现了ISAPIExtention的功能,他处理请求(Request)的信息和发送响应(Response)。
HttpHandler功能的实现通过实现IHttpHandler接口来到达。
处理程序是实现了System.Web.IHttpHandler接口的.NET组件。
任何实现了IHttpHandler接口的类都可以用于处理输入的请求。
处理程序与ISAPI扩展有些类似。
处理程序和ISAPI扩展的差异在于在URL中可以使用处理程序的文件名称直接调用它们,与ISAPI扩展类似。
HttpHandler的实现,实现我们的处理程序包含以下步骤:
编写一个实现IHttpHandler接口的类。
在web.config或machine.config文件中这个处理程序。
在Inter效劳管理器中把文件扩展(你想要处理的文件扩展名)映射到ASP.NETISAPI扩展DLL(aspisapi.dll)上。
我们来看一个例子,翻开IIS效劳器,属性,主目录下有个配置,里面你就可以找到你的程序所执行文件所要调用的.dll文件。
我们可以看到.aspx就是C:
WINDOWSMicrosoft.NETFramework2.0.50727as
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASP NET架构及开发技术详解教程 NET 架构 开发 技术 详解 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)