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();