IStartupFilter

  使用IStartupFilter

  • 再应用的中间件管道的开头或末尾配置中间件,而无需显式调用Use{Middleware}。使用IStartupFilter在不显式注册默认中间件的情况下将默认值添加到管道的开头。
  • 创建Configure方法的管道。IStartupFilter.Configure可以将中间件设置为在库添加的中间件之前或之后运行。

  每个 IStartupFilter 可以在请求管道中添加一个或多个中间件。 筛选器按照添加到服务容器的顺序调用。 筛选器可在将控件传递给下一个筛选器之前或之后添加中间件,从而附加到应用管道的开头或末尾。

下面的示例演示如何使用 IStartupFilter 注册中间件。 RequestSetOptionsMiddleware 中间件从查询字符串参数中设置选项值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class RequestSetOptionsMiddleware
{
private readonly RequestDelegate _next;

public RequestSetOptionsMiddleware(RequestDelegate next)
{
_next = next;
}

public async Task InvokeAsync(HttpContext httpContext)
{
var option = httpContext.Request.Query["option"];

if(!string.IsNullOrWhiteSpace(option))
{
httpContext.Items["option"] = WebUtility.HtmlEncode(option);
}

await _next(httpContext);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
// 在调用下一个中间件之前使用RequestSetOptionsMiddleware中间件
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
1
2
3
4
5
6
7
8
9
10
11
12
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddTransient<IStartupFilter,RequestSetOptionsStartupFilter>();

var app = builder.Build();

app.MapGet("/", (HttpContext httpContext) =>
{
return $"option: {httpContext.Items["option"]}";
});

app.Run();

  中间件执行顺序由 IStartupFilter 注册顺序设置:

  • 多个 IStartupFilter 实现可能与相同的对象进行交互。 如果顺序很重要,请将它们的 IStartupFilter 服务注册进行排序,以匹配其中间件应有的运行顺序。
  • 库可能添加包含一个或多个 IStartupFilter 实现的中间件,这些实现在向 IStartupFilter 注册的其他应用中间件之前或之后运行。 若要在库的 IStartupFilter 添加的中间件之前调用 IStartupFilter 中间件,请执行以下操作:
    • 在库添加到服务容器之前定位服务注册。
    • 要在此后调用,请在添加库之后定位服务注册。