`
zendj
  • 浏览: 125120 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ASP.Net中自定义Http处理及应用

阅读更多

ASP.Net中自定义Http处理及应用

www.itonline.gd.cn 2003-12-11



在开发基于MicrosoftIIS的应用时,开发者除了可以编写ASP程序外,还可以使用VisualC++等开发工具,开发ISAPI应用,以获取更为强大的功能。可以编写两种ISAPI扩展:一种是ISAPIServerExtention,另一种是ISAPIFilter,但是,ISAPI扩展应用的编写通常对开发者有比较高的要求,开发和部署的难度比较大。在开发ASP.Net应用时,我们仍然可以编写ISAPI应用,以扩充IIS的功能,但是,ASP.Net为我们提供了另外一种选择——使用HTTPHandler和HTTPModule。这是通过使用IHttpHandler和IHttpModule接口来实现的。HTTPHandler提供了类似于ISAPIServerExtention的功能,而HttpModule实现了类似于ISAPIFilter的功能,并且,比ISAPI,在开发和部署上都要简单的多。应用HttpHandler和HttpModule,使应用程序可以与IISWeb服务器的低级别请求和响应服务交互。本文首先介绍HttpHandler和HttpModule的概念和基本使用方法,并介绍了一个应用HttpModule实现权限系统的案例。
HTTP处理管道的基本模型

  要对HttpModule和IHttpHandler进行研究,必须先对ASP.Net的处理管道有一个了解。在ASP.Net应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(Request),ASP.NET应用程序的处理模式可称之为HTTP处理管道。HttpModule和IhttpHandler就是这个处理管道上的两个处理环节。HTTP处理管道中的类在System.Web名称空间中定义,主要有以下类型:·
HttpWorkerRequest抽象类定义了ASP.Net页面处理请求的基本方法;·HttpRuntime提供了处理应用的一组服务;·HttpContext保存了处理一次请求的所有相关上下文信息;·HttpApplicationFactory提供相关目录的应用程序;·HttpApplication定义了所有ASP.Net应用程序的通用的方法、属性和事件。这个类也是在用户在global.asax文件中定义的应用的基类;·Modules处理请求前和响应后的事件;·HandlerFactories提供应用程序中的Handlers;·Handlers处理请求和响应。HTTP处理管道的模型如下:

图1:HTTP处理管道
  在Windows平台上,HTTPPipline需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE·ASPNET_ISAPI.DLL是一个ISAPIExtention他将发向IIS的请转交ASPNET_WP.EXE处理·ASPNET_WP.EXE使用HttpRuntime对请求进行具体处理处理的过程可以用图表示如下:

图2:IIS上的HTTP处理管道

 HttpHandler的实现
  HttpHandler实现了类似于ISAPIExtention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。实际上,我们在编写ASP.Net页面时,ASP.Net页面所继承的基类——System.Web.UI.Page——也实现了HttpHandler接口,也是一个HttpHandler,看一下它的定义就知道了(C#):
publicclassPage:TemplateControl,IhttpHandler

  接口IHttpHandler的定义如下:
interfaceIHttpHandler
{
voidProcessRequest(HttpContextctx);
boolIsReuseable{get;}
}

  接口中ProcessRequest是添加自己的代码,进行相应处理的地方。IsReuseable属性指明该HttpHandler的实现类是否需要缓存。下面的示例展示了HttpHandler的基本使用:1、建立一个名为MyNameSpace的工程,添加一个类,名称为MyHandler,代码如下:
例1:
namespaceMyNameSpace
{
publicclassMyHandler:IHttpHandler
{
publicvoidProcessRequest(HttpContextctx)
{
HttpResponseResponse
Response.Write("Thisismyhandler");}
publicboolIsReusable
{
get{returntrue;}
}
}
}

  2、将上面的代码编译,生成MyNameSpace.Dll文件;3、建立一个新的WebApplication项目,或打开一个WebApplication项目,将文件MyNameSpace.Dll添加到项目的引用中,或复制到项目的bin目录下;4、修改Web.Config,添加如下内容:
<configuration>
<system.web>
<httpHndlers>
<addverb="*"path="*.aspx"
type="MyNameSpace.MyHandr,MyNameSpace"/>
</httpHndlers>
</system.web>
</configuration>

  配置文件中的选项说明:·verb可以是"GET"或"POST",表示对GET或POST的请求进行处理。"*"表示对所有请求进行处理。·Path指明对相应的文件进行处理,"*.aspx"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/test/*.aspx",表明只对test目录下的ASPX文件进行处理。·Type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字:
Thisismyhandler


  因为,我们自定义的Handler截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。为了使我们的ASPX页面能够顺利运行,我们需要修改Web.Config文件:
<configuration>
<system.web>
<httpHndlers>
<addverb="*"path="*.foo"
type="MyNameSpace.MyHandr,hander"/>
</httpHndlers>
</system.web>
</configuration>


  为了让对后缀名为.foo的文件的请求能够被我们的Handler截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项。如图3:

  图3:Web站点属性对话框
  选择配置,弹出应用程序配置对话框,将".foo"添加到应用程序映射中,如图4:

  图4:添加应用程序映射
好了,我们现在可以在项目中添加一个.foo文件,当向该文件发送请求时,浏览器显示:
Thisismyhandler


  而对其他ASPX文件的访问不受影响。
实现HandlerFactory
实现HttpHandler功能的另外一个选择是实现一个HandlerFactory,这是通过实现IHttpHandlerFactory接口来实现的。IHttpHandlerFactory接口的定义如下:
interfaceIHttpHandlerFactory
{
IHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated);
voidReleaseHandler(IHttpHandlerhandler);
}


G  etHandler方法在请求开始的时候被调用,而ReleaseHandler在请求结束,所有的Handler都不再需要的时候被调用。使用HttpHandlerFactory的过程一般如下:首先定义实际处理HttpHandler的类,这个类会在HandlerFactory中被调用以进行实际的处理:
publicclassBasicHandler:IHttpHandler{...}


  然后,定义自己的HandlerFactory:
publicclassBasicHandlerFactory:IHttpHandlerFactory
{
publicIHttpHandlerGetHandler(HttpContextctx,
stringrequestType,
stringurl,
stringpathTranslated)
{
returnnewBasicHandler();
}
publicvoidReleaseHandler(IHttpHandlerhandler){}
}


  最后,在Web.Config文件中注册这个Factory:
<configuration>
<system.web>
<httpHandlers>
<addverb="POST"path="*.foo"
type="MyNamespace.BasicHandlerFactory,MyAssembly"/>
</httpHandlers>
</system.web>
</configuration>



 异步Handler
  通过实现IHttpAsyncHandler可以实现对HTTP请求的异步处理。IHttpAsyncHandler接口继承IHttpHandler,也需要实现ProcessRequest方法和IsReusable属性,同时,需要实现BeginProcessRequest和EndProcessRequest方法。BeginProcessRequest启动异步调用以处理单个的HTTP请求,而EndProcessRequest则在该进程结束时执行清理代码。IHttpAsyncHandler的实现和注册同IHttpHandler类似,读者可以参考MSDN的相关文档。现在,大家是否对HTTPHandler的概念和应用有了一定的了解?在下一篇文章中,我们将主要介绍HTTPModule的的应用,并给出使用HttpModule实现权限系统的实例。

分享到:
评论

相关推荐

    ASP.Net中自定义Http处理及其应用

    在ASP.NET中,自定义HTTP处理是扩展其功能和控制请求处理流程的关键技术。本文将深入探讨自定义HTTP处理,包括HTTP Handler(IHttpHandler)和HTTP Module(IHttpModule),并展示它们在实际应用中的用例。 **一、...

    asp.net GridView自定义控件源码

    `Web.Config`是ASP.NET应用程序的配置文件,它包含了诸如连接字符串、身份验证模式、错误处理等设置。在自定义控件的上下文中,可能有特定的配置节来设定控件的行为或者引用自定义控件的命名空间。 `Default.aspx....

    Asp.net Core中实现自定义身份认证的示例代码

    在了解如何在*** Core中实现自定义身份认证之前,我们需要先理解*** Core中的身份认证机制。身份认证是验证用户身份的过程,*** Core提供了一套完整的身份认证系统,允许开发者自定义身份认证过程以满足不同场景的...

    基于ASP.NET的自定义分页显示

    在ASP.NET框架下,开发Web应用时,经常会遇到大量的数据库记录需要在网页上展示的问题。这时,自定义分页显示就显得尤为重要。本文将深入探讨如何在ASP.NET环境中,结合DataGrid控件实现高效且用户友好的分页功能。 ...

    ASP.NET用户控件和自定义控件

    在ASP.NET中,用户控件和自定义控件是两种重要的组件,它们扩展了.NET Framework的内置控件,帮助开发者创建具有特定功能和交互性的界面元素。 **用户控件(User Control)** 用户控件是ASP.NET中的基本自定义UI元素...

    【ASP.NET编程知识】ASP.NET MVC自定义错误页面真的简单吗.docx

    ASP.NET MVC 中自定义错误页面是指在 ASP.NET MVC 应用程序中,当出现错误时,返回给用户的错误页面。这种错误页面可以是自定义的,以提供更友好的错误信息和更好的用户体验。 在 ASP.NET MVC 中,自定义错误页面...

    asp.net 自定义下拉多选控件

    总结起来,"asp.net 自定义下拉多选控件"是一个结合了JQuery和ASP.NET技术的高效组件,它为开发者提供了在Web应用中实现多选下拉功能的简便方式。通过理解并运用这些知识点,开发者可以进一步提升自己在ASP.NET开发...

    asp.net 自定义控件源码

    ASP.NET自定义控件是开发ASP.NET Web应用程序时的一个重要技术。它允许开发者根据特定需求创建功能独特的用户界面元素,从而提高应用的可扩展性和可维护性。在本压缩包中,提供的“asp.net 自定义控件源码”是个人...

    asp.net用户自定义控件及调的工程

    通过学习和实践这个“asp.net用户自定义控件及调的工程”,开发者可以深入了解ASP.NET的自定义控件机制,提升构建高效、可维护的Web应用的能力。同时,掌握好自定义控件的使用,对于提高开发效率和代码质量具有重要...

    ASP.NET自定义控件实例教程

    ASP.NET自定义控件是.NET框架中用于构建可重用、可扩展的用户界面组件的重要技术。本实例教程旨在引导开发者深入理解并掌握这一技术,通过一系列由浅入深的例子,帮助你创建从简单到复杂的数据绑定控件。 首先,...

    ASP.NET自定义验证控件

    总的来说,ASP.NET自定义验证控件是提升应用程序功能和用户体验的重要手段,尤其在处理特殊验证需求时,自定义控件能展现出其强大的灵活性和可定制性。理解并掌握自定义验证控件的创建和使用,对于提升ASP.NET开发...

    asp.net 自定义用户控件 事件

    ASP.NET自定义用户控件是开发高效、可重用网页应用程序的重要组成部分。它允许开发者创建具有特定功能的自定义组件,这些组件可以嵌入到网页中,并与其他ASP.NET控件一起工作。在ASP.NET中,自定义用户控件提供了一...

    Asp.net 用户自定义控件的编写

    5. **使用控件**:一旦注册,就可以像使用内置控件一样在任何Asp.net页面中插入用户自定义控件,通过属性设置其行为,并处理其触发的事件。 接下来,我们要关注一些关键知识点: - **属性**:自定义控件的属性可以...

    ASP.NET2.0自定义控件和组件开发

    ASP.NET 2.0 自定义控件和组件开发是.NET框架中的一个重要部分,它允许开发者创建可重用的代码块,提升开发效率并保持代码的整洁。本篇将重点介绍如何开发自定义控件,尤其是基于Control类的控件。 自定义控件的...

    asp.net自定义列源码

    在这个“asp.net自定义列源码”中,我们可以推测作者张亚东通过VB(Visual Basic)语言,实现了一种自定义列的功能,这对于学习ASP.NET特别是对数据展示有特定需求的初学者来说是非常有价值的。 在ASP.NET中,...

    ASP.NET开发自定义组建

    综上所述,ASP.NET自定义组件的开发是一个涵盖多方面技能和知识的过程,涉及到.NET Framework的理解、面向对象编程、事件驱动编程以及对Web应用程序生命周期的掌握。结合提供的文档和文件,开发者可以更深入地学习和...

    asp.net 2.0 自定义控件--翻页(han源码)

    在这个“asp.net 2.0 自定义控件--翻页(han源码)”项目中,我们看到一个用C#编写的自定义控件,专门用于为GridView提供翻页功能。对于初学者来说,理解和实现这样的控件是非常有价值的,因为它可以帮助他们更好地...

    asp.net 编写自定义控件

    在ASP.NET中,自定义控件是开发人员为了满足特定需求而创建的用户界面元素,它们可以扩展标准ASP.NET服务器控件的功能或者提供全新的功能。本教程将带你一步步了解如何编写自定义控件,适用于ASP.NET初学者。 一、...

    Asp.net 2.0 自定义控件开发[浮动工具条控件].rar

    在Asp.net 2.0框架中,自定义控件的开发是一项重要的技能,它可以极大地扩展Web应用程序的功能和用户体验。本教程重点讲解如何为Asp.net 2.0开发一个浮动工具条控件,该控件可以实现在网页上动态显示和隐藏,提供...

    ASP.NET Core自定义中间件如何读取Request.Body与Response.Body的内容详解

    ASP.NET Core自定义中间件是框架提供的一种扩展点,允许开发者在请求生命周期的特定阶段插入自定义逻辑。本文将深入探讨如何在自定义中间件中读取`Request.Body`和`Response.Body`的内容。 首先,`Request.Body`...

Global site tag (gtag.js) - Google Analytics