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

简介:

在开发基于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);
}

GetHandler方法在请求开始的时候被调用,而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实现权限系统的实例。

目录
相关文章
|
2月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
135 10
|
25天前
如何自定义一个dataDispatcher,用于收束http和websoket
【10月更文挑战第17天】如何自定义一个dataDispatcher,用于收束http和websoket
18 1
如何自定义一个dataDispatcher,用于收束http和websoket
|
11天前
|
消息中间件 测试技术
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
轻量消息队列(原MNS)以其简单队列模型、轻量化协议及按量后付费模式,成为阿里云产品间消息传输首选。本文通过创建主题、订阅、配置告警集成等步骤,展示了该产品在实际应用中的部分功能,确保消息的可靠传输。
33 2
|
15天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
29天前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
|
1月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
129 6
|
1月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
28 0
|
3月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
60 0
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
72 0

热门文章

最新文章

下一篇
无影云桌面