在以下中间件可用的中间件中定义变量

gla*_*asa 5 asp.net-core asp.net-core-middleware

我正在使用asp.net core,在调用完整的Web应用程序之前,我想从请求中获取一些数据。

因此,我创建了一个中间件来执行此操作。我找到了一种检查所需内容的方法,但是我不知道如何将变量传递给以下中间件

app.Use(async (context, next) => {
    var requestInfo = GetRequestInfo(context.Request);
    if(requestInfo == null)
    {
        context.Response.StatusCode = 404;
        return;
    }

    // How do I make the request info available to the following middlewares ?

    await next();
});

app.Run(async (context) =>
{
    // var requestInfo =  ???
    await context.Response.WriteAsync("Hello World! - " + env.EnvironmentName);
});
Run Code Online (Sandbox Code Playgroud)

是否存在将数据从中间件传递给其他人的好方法?(我在这里使用app.Run,但我希望在MVC中拥有所有这些功能)

gla*_*asa 5

我找到了解决方案:上下文包含一个IFeatureCollection,并且记录在此处

我们只需要创建一个包含所有数据的类:

public class RequestInfo
{
    public String Info1 { get; set; }
    public int Info2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们将其添加到context.Features

app.Use(async (context, next) => {
    RequestInfo requestInfo = GetRequestInfo(context.Request);
    if(requestInfo == null)
    {
        context.Response.StatusCode = 404;
        return;
    }

    // We add it to the Features collection
    context.Features.Set(requestInfo)

    await next();
});
Run Code Online (Sandbox Code Playgroud)

现在它可用于其他中间件:

app.Run(async (context) =>
{
    var requestInfo = context.Features.Get<RequestInfo>();
});
Run Code Online (Sandbox Code Playgroud)


Hen*_*ema 5

除了功能,还有另一种-在我看来,一个简单的-解决方案:HttpContext.Items作为描述在这里。根据docs,它是专门为存储单个请求范围内的数据而设计的。

您的实现如下所示:

// Set data:
context.Items["RequestInfo"] = requestInfo;

// Read data:
var requestInfo = (RequestInfo)context.Items["RequestInfo"];
Run Code Online (Sandbox Code Playgroud)