管道模型与执行顺序
IMiddleware 接口
#[async_trait]
pub trait IMiddleware: Send + Sync {
async fn invoke(&self, ctx: &mut dyn IHttpContext) -> Result<()>;
}
执行模型
当前版本为**顺序管道**(非洋葱模型):
请求 → MW1 → MW2 → MW3 → Router → Endpoint
每个中间件按注册顺序调用。中间件可**短路**——设置 response status 后直接返回,跳过后续处理和路由。
短路示例
#[async_trait]
impl IMiddleware for AuthMiddleware {
async fn invoke(&self, ctx: &mut dyn IHttpContext) -> Result<()> {
if ctx.claims().is_none() {
ctx.response_mut().set_status(401);
return Ok(()); // 短路,不继续
}
Ok(())
}
}
与 ASP.NET Core 的差异
ASP.NET Core 中间件支持 `next()` 闭包实现洋葱模型(请求进入和响应返回各经过一次)。rust-webx 当前为顺序调用,响应阶段不回溯中间件。
> 后续版本计划在 async closure 稳定后升级为洋葱模型。
IHttpContext
中间件通过 `IHttpContext` 访问请求和响应:
let method = ctx.request().method();
let path = ctx.request().path();
ctx.response_mut().set_header("X-Custom", "value");
小结
中间件是 HTTP 层的横切拦截器,通过短路机制实现认证拒绝、限流等。
下一节:[内置中间件一览](built-in-middleware.md)