Asp.Net WebAPI C#中的内置消息处理程序是构建请求响应处理管道的核心组件,主要负责在HTTP请求到达控制器之前、响应返回客户端之前对消息进行拦截和处理,是扩展WebAPI功能的重要方式。

内置消息处理程序的基础概念
消息处理程序在Asp.Net WebAPI中继承自DelegatingHandler抽象类,所有内置和自定义的消息处理程序都属于这个类型体系。DelegatingHandler本身实现了HttpMessageHandler接口,内部维护了一个指向下一个处理程序的引用,形成了链式处理结构。
当客户端发送HTTP请求到WebAPI时,请求会依次经过管道中的各个消息处理程序,最终到达控制器执行对应的业务逻辑,之后响应会沿相反的顺序经过这些处理程序返回给客户端。
内置消息处理程序的默认类型
Asp.Net WebAPI框架默认提供了几个基础的内置消息处理程序,常用的包括:
- HttpServer:作为整个消息处理管道的入口,负责接收初始的HTTP请求,启动整个处理流程。
- HttpRoutingDispatcher:负责根据请求的路由信息,将请求分发到对应的控制器和处理方法。
- HttpControllerDispatcher:负责执行具体的控制器逻辑,调用对应的Action方法处理请求。
消息处理程序的核心作用
内置消息处理程序主要承担以下几类核心功能:
- 请求预处理:在请求到达控制器前校验请求头、参数合法性,或者添加通用的请求头信息。
- 响应后处理:在响应返回前修改响应内容、添加响应头,或者处理响应异常。
- 通用逻辑封装:将日志记录、性能监控、跨域处理等通用逻辑从业务代码中剥离,实现代码复用。
自定义消息处理程序示例
虽然框架提供了内置的基础处理程序,但实际开发中我们经常需要自定义消息处理程序来实现特定需求,比如记录所有请求的日志。下面是一个简单的请求日志处理程序示例:
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
namespace WebApiDemo.Handlers
{
// 自定义消息处理程序需要继承DelegatingHandler
public class RequestLogHandler : DelegatingHandler
{
// 重写SendAsync方法实现请求拦截处理
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
// 记录请求信息
Console.WriteLine($"收到请求:{request.Method} {request.RequestUri}");
Console.WriteLine($"请求时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
// 调用下一个处理程序,将请求继续传递
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
// 记录响应信息
Console.WriteLine($"响应状态码:{response.StatusCode}");
Console.WriteLine($"响应时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
return response;
}
}
}
注册自定义消息处理程序
自定义的消息处理程序需要注册到WebAPI的消息处理管道中才能生效,在WebAPI的配置类中添加如下代码即可:
using System.Web.Http;
using WebApiDemo.Handlers;
namespace WebApiDemo
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// 注册自定义消息处理程序,添加到管道开头
config.MessageHandlers.Add(new RequestLogHandler());
// 其他配置:路由、格式化器等
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
消息处理程序的执行顺序
消息处理程序的执行顺序和注册顺序一致,先注册的先处理请求,后处理响应。比如我们注册了两个处理程序A和B,执行流程如下:
| 阶段 | 执行顺序 |
|---|---|
| 请求处理阶段 | A的请求逻辑 → B的请求逻辑 → 控制器处理 |
| 响应处理阶段 | B的响应逻辑 → A的响应逻辑 → 返回客户端 |
注意事项
在使用消息处理程序时需要注意几个问题:
- 不要在消息处理程序中执行耗时过长的操作,避免阻塞请求处理流程,影响接口性能。
- 如果需要在处理程序中访问请求内容,需要注意请求内容流只能读取一次,读取后需要重新设置流位置,避免后续处理程序无法读取。
- 异常处理尽量在处理程序内部完成,避免未处理的异常直接抛到管道外层,导致接口返回不友好的错误信息。
消息处理程序是Asp.Net WebAPI中非常灵活的扩展点,合理使用可以大幅减少重复代码,提升接口的可维护性。
Asp.Net_WebAPI消息处理程序DelegatingHandlerHttpRequestMessageHttpResponseMessage修改时间:2026-06-23 17:57:46