在以下可用的中间件中定义一个变量
Define a variable in a middleware available to the following ones
我正在使用 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 中拥有所有这些)
我找到了解决方案:上下文包含 IFeatureCollection
和 it is documented here
我们只需要用所有数据创建一个 class :
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>();
});
除了功能之外,还有另一个 - 在我看来更简单 - 解决方案:HttpContext.Items
,如 . According to the docs 所述,它专门设计用于存储单个请求范围内的数据。
您的实现将如下所示:
// Set data:
context.Items["RequestInfo"] = requestInfo;
// Read data:
var requestInfo = (RequestInfo)context.Items["RequestInfo"];
我正在使用 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 中拥有所有这些)
我找到了解决方案:上下文包含 IFeatureCollection
和 it is documented here
我们只需要用所有数据创建一个 class :
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>();
});
除了功能之外,还有另一个 - 在我看来更简单 - 解决方案:HttpContext.Items
,如
您的实现将如下所示:
// Set data:
context.Items["RequestInfo"] = requestInfo;
// Read data:
var requestInfo = (RequestInfo)context.Items["RequestInfo"];