- ASP.NET Core与RESTful API 开发实战
- 杨万青
- 442字
- 2020-08-27 11:23:26
3.2.3 自定义中间件
创建自定义中间件非常简单,需要至少一个特定的构造函数和一个名为Invoke的方法。对于构造函数,应包括一个RequestDelegate类型的参数,该参数表示在管道中的下一个中间件;而对于Invoke方法,应包括一个HttpContext类型的参数,并返回Task类型。
创建自定义中间件可以很灵活地控制HTTP请求的处理流程,比如要让应用程序仅接受GET和HEAD方法,就可以创建如下的中间件:
public class HttpMethodCheckMiddleware { private readonly RequestDelegate_next; public HttpMethodCheckMiddleware(RequestDelegate requestDelegate, IHostingEnvironment environment) { this._next = requestDelegate; } public Task Invoke(HttpContext context) { var requestMethod = context.Request.Method.ToUpper(); if (requestMethod == HttpMethods.Get || requestMethod == HttpMethods.Head) { return_next(context); } else { context.Response.StatusCode = 400; context.Response.Headers.Add("X-AllowHTTPVerb", new[] { "GET,HEAD" }); context.Response.WriteAsync("只支持 GET、HEAD方法"); return Task.CompletedTask; } } }
在中间件的构造函数中,可以得到下一个中间件,并且还可以注入需要的服务,如上例中的IhostingEnvironment参数。在Invoke方法中,对HTTP请求方法进行判断,如果符合条件,则继续执行下一个中间件;否则返回400 Bad Request错误,并在响应中添加了自定义消息头,用于说明错误原因。
接下来,在Configure方法中添加中间件:
app.UseMiddleware<HttpMethodCheckMiddleware>();
添加时应注意其顺序,比如,上面中间件应位于MVC中间件之前。为了更方便地使用自定义中间件,还可以为它创建一个扩展方法。
public static class CustomMiddlewareExtensions { public static IApplicationBuilder UseHttpMethodCheckMiddleware(this Iapplication Builder builder) { return builder.UseMiddleware<HttpMethodCheckMiddleware>(); } }
使用时,只要调用该扩展方法即可:
app.UseHttpMethodCheckMiddleware();