Определите переменную в промежуточном программном обеспечении, доступном для следующих

Я использую ядро ​​asp.net, и я хотел бы получить несколько данных из запроса, прежде чем я вызову полное веб-приложение.

Поэтому я создал промежуточное программное обеспечение для этого. Я нашел способ проверить все, что я хочу, но я не знаю, как передать переменную в промежуточное программное обеспечение

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

Есть ли хороший способ передать данные из промежуточного ПО другим? (здесь я использую app.Runно хотелось бы все это в MVC)

2 ответа

Решение

Помимо функций, есть и другое - на мой взгляд, более простое решение: HttpContext.Items, как описано здесь. Согласно документам, он специально предназначен для хранения данных в рамках одного запроса.

Ваша реализация будет выглядеть так:

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

// Read data:
var requestInfo = (RequestInfo)context.Items["RequestInfo"];

Я нашел решение: контекст содержит IFeatureCollectionи это задокументировано здесь

Нам просто нужно создать класс со всеми данными:

public class RequestInfo
{
    public String Info1 { get; set; }
    public int Info2 { get; set; }
}

И мы добавим его в 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();
});

Теперь он доступен для других промежуточных программ:

app.Run(async (context) =>
{
    var requestInfo = context.Features.Get<RequestInfo>();
});
Другие вопросы по тегам