Определите переменную в промежуточном программном обеспечении, доступном для следующих
Я использую ядро 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>();
});