如何将原始数据传递给asp.net核心中间件

Chr*_*sCa 4 c# asp.net-core

我需要将一些数据传递到ASP NET CORE中间件中

例如,如果这是一个字符串列表,您是否使用与传递服务相同的机制?

例如将其作为参数添加到Invoke方法中,并在DI中注册它?

如果是这样,您如何注册原始类型?例如,不许使用字符串。它必须是命名类型还是类似的名称?

还是我们可以通过其他方式传递数据?

谢谢

Ily*_*kov 6

假设我们有一个中间件:

public class FooMiddleware
{
    public FooMiddleware(RequestDelegate next, List<string> list)
    {
        _next = next;
    }
}
Run Code Online (Sandbox Code Playgroud)

只需传递一个列表来UseMiddleware调用即可解决每个中间件

app.UseMiddleware<FooMiddleware>(new List<string>());
Run Code Online (Sandbox Code Playgroud)

您可以创建一个DTO并通过它:

public FooMiddleware(RequestDelegate next, Payload payload)
....
app.UseMiddleware<FooMiddleware>(new Payload());    
Run Code Online (Sandbox Code Playgroud)

或在DI容器中注册此DTO,它将在中间件中解决:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<Payload>(new Payload());
}
Run Code Online (Sandbox Code Playgroud)

另外,DI容器允许解析每个请求的依赖关系:

public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
{
    svc.MyProperty = 1000;
    await _next(httpContext);
}
Run Code Online (Sandbox Code Playgroud)

说明文件:

由于中间件是在应用程序启动时 构建的,而不是在每个请求时构建的,因此在每次请求期间,中间件构造函数使用的作用域生存期服务不会与其他依赖项注入类型共享。如果必须在中间件和其他类型之间共享作用域服务,请将这些服务添加到Invoke方法的签名中。该 Invoke方法可以接受由依赖项注入填充的其他参数。