在 ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件

ASP.NET 中 HttpHandler 的用法详解

ASP.NET 中,HTTP 处理程序(HttpHandler)是处理 HTTP 请求的核心组件。根据你的配置文件,我将详细解释 <handlers> 节点的各种用法和配置选项。

1. HttpHandler 概述

HttpHandler 是 ASP.NET 请求处理管道的终点,负责生成响应内容。它的主要作用包括:

  • 处理特定类型的请求(如 .ashx.pdf.jpg 等)
  • 实现自定义的请求处理逻辑
  • 提供无页面的轻量级服务
  • 处理 WebSocket 连接

2. 配置文件中的 <handlers> 节点

<handlers> 节点位于 <system.webServer> 部分(IIS 7+ 集成模式),用于注册和配置 HTTP 处理程序。你的配置示例中展示了几种典型用法:xml

复制代码
<handlers>
  <add name="UploadHandler" path="UploadHandler/" verb="POST" type="WebUpload.UploadHandler, WebUpload" />
  <add name="FirstHandler" path="FirstHandler.ashx" verb="*" type="TkServerLib.FirstHandler, TkServerLibDLL" />
  <add name="SecondHandler" path="SecondHandler.ashx" verb="*" type="TkServerLib.SecondHandler, TkServerLibDLL" />
  <add name="AllHandlers" path="*.ashx" verb="*" type="TkServerLib.ApilHandler, TkServerLibDLL" />
</handlers>

3. 主要配置参数说明

参数 描述 示例值
name 处理程序的唯一名称,用于标识和管理处理程序 UploadHandler
path 匹配的请求路径,可以是具体路径、通配符或目录 FirstHandler.ashx, *.ashx, UploadHandler/
verb 允许的 HTTP 动词(GET、POST 等),使用 * 表示所有动词 GET,POST, *
type 处理程序的完全限定类型名(命名空间。类名,程序集名) WebUpload.UploadHandler, WebUpload
preCondition 执行处理程序的前提条件(如集成模式、托管管道模式等) integratedMode, managedHandler

4. 具体用法分类

4.1 精确路径匹配xml
复制代码
<add name="FirstHandler" path="FirstHandler.ashx" verb="*" type="TkServerLib.FirstHandler, TkServerLibDLL" />
  • 特点 :仅处理路径为 FirstHandler.ashx 的请求
  • 适用场景:为特定功能创建独立的处理程序
4.2 扩展名通配符匹配xml
复制代码
<add name="AllHandlers" path="*.ashx" verb="*" type="TkServerLib.ApilHandler, TkServerLibDLL" />
  • 特点 :处理所有 .ashx 扩展名的请求
  • 适用场景:统一处理某种类型的请求(如所有 AJAX 请求)
4.3 目录匹配xml
复制代码
<add name="UploadHandler" path="UploadHandler/" verb="POST" type="WebUpload.UploadHandler, WebUpload" />
  • 特点 :处理 /UploadHandler/ 目录下的所有请求(仅 POST 方法)
  • 适用场景:对特定目录下的请求进行统一处理
4.4 HTTP 动词限制xml
复制代码
<add name="UploadHandler" path="UploadHandler/" verb="POST" type="WebUpload.UploadHandler, WebUpload" />
  • 特点:仅处理 POST 请求,忽略 GET 等其他请求
  • 适用场景:需要限制请求方法的操作(如文件上传、表单提交)
4.5 多处理程序组合

你的配置中同时使用了具体路径和通配符:xml

复制代码
<add name="FirstHandler" path="FirstHandler.ashx" verb="*" type="TkServerLib.FirstHandler, TkServerLibDLL" />
<add name="AllHandlers" path="*.ashx" verb="*" type="TkServerLib.ApilHandler, TkServerLibDLL" />
  • 处理顺序:精确匹配优先于通配符匹配
  • 结果FirstHandler.ashxFirstHandler 处理,其他 .ashx 文件由 ApilHandler 处理

5. 其他常见配置选项

5.1 移除内置处理程序xml
复制代码
<remove name="WebServiceHandlerFactory-Integrated" />
  • 作用 :禁用 ASP.NET 内置的处理程序
  • 场景:需要自定义处理特定类型的请求
5.2 替换内置处理程序xml
复制代码
<remove name="PageHandlerFactory-Integrated" />
<add name="CustomPageHandler" path="*.aspx" verb="*" type="MyNamespace.CustomPageHandler, MyAssembly" />
  • 作用:用自定义处理程序替换默认的页面处理程序
  • 场景:需要对所有 ASPX 页面进行统一处理
5.3 设置 preConditionxml
复制代码
<add name="MyHandler" path="MyHandler.ashx" verb="*" type="MyNamespace.MyHandler, MyAssembly" preCondition="integratedMode" />
  • 作用:仅在集成管道模式下启用处理程序
  • 场景:避免在经典模式下使用可能导致冲突的处理程序

6. 自定义 HttpHandler 实现示例vb

复制代码
Imports System.Web

Public Class UploadHandler : Implements IHttpHandler
    Public ReadOnly Property IsReusable As Boolean _
        Implements IHttpHandler.IsReusable
        Get
            Return True
        End Get
    End Property
    
    Public Sub ProcessRequest(context As HttpContext) _
        Implements IHttpHandler.ProcessRequest
        ' 处理上传逻辑
        Dim file = context.Request.Files(0)
        If file IsNot Nothing AndAlso file.ContentLength > 0 Then
            file.SaveAs(context.Server.MapPath("~/uploads/" & file.FileName))
            context.Response.Write("上传成功")
        Else
            context.Response.StatusCode = 400
            context.Response.Write("未上传文件")
        End If
    End Sub
End Class

7. 注意事项

  1. 处理程序顺序

    • 配置顺序很重要,精确匹配应放在通配符匹配之前
    • 使用 <clear /> 标签可以清除所有默认处理程序
  2. 性能考虑

    • 避免过多的通配符匹配,会影响性能
    • 对于频繁访问的资源,考虑使用缓存处理程序
  3. 错误处理

    • 确保处理程序能够处理各种异常情况
    • 使用 <httpErrors> 节点配置统一的错误处理
  4. 集成模式与经典模式

    • 确保 preCondition 与应用程序池模式匹配
    • 在经典模式下,部分处理程序需要在 <system.web> 中配置

总结

<handlers> 节点提供了强大而灵活的请求处理机制,通过合理配置可以实现:

  • 精确的请求路径控制
  • 基于 HTTP 动词的请求过滤
  • 自定义处理程序的注册
  • 内置处理程序的替换和移除

你的配置已经展示了几种常见用法,根据实际需求,你可以进一步扩展和优化这些配置。

相关推荐
老葱头蒸鸡14 小时前
(8)ASP.NET Core2.2 中的MVC路由一
后端·asp.net·mvc
FuckPatience2 天前
ASP.NET Core RazorPages/MVC/Blazor/Razor/WebApi概念记录说明
后端·asp.net
神仙别闹2 天前
基于ASP.NET+SQL Server简单的 MVC 电商网站
log4j·asp.net·mvc
智商偏低12 天前
ASP.NET Core 中的简单授权
后端·asp.net
是萝卜干呀14 天前
IIS 部署 asp.net core 项目时,出现500.19、500.31问题的解决方案
后端·iis·asp.net·hosting bundle
速易达网络16 天前
ASP.NET MVC 连接 MySQL 数据库查询示例
数据库·asp.net·mvc
智商偏低16 天前
ASP.NET Core 身份验证概述
后端·asp.net
冷冷的菜哥16 天前
ASP.NET Core使用MailKit发送邮件
后端·c#·asp.net·发送邮件·mailkit
冷冷的菜哥20 天前
ASP.NET Core文件分片上传
c#·asp.net·asp.net core·文件分片上传
前端世界22 天前
ASP.NET 实战:用 SqlCommand 打造一个安全的用户注册功能
后端·安全·asp.net