ASP.NET 核心中间件向控制器传递参数
ASP.NET Core Middleware Passing Parameters to Controllers
我正在使用 ASP.NET Core Web API
,其中我有多个独立的网络 api 项目。在执行控制器的任何操作之前,我必须检查登录用户是否已经在模拟其他用户(我可以从 DB
获得)并且可以将模拟用户 Id
传递给 actions
.
由于这是一段要重复使用的代码,我想我可以使用中间件:
- 我可以从请求中获取初始用户登录 header
- 获取模拟的用户 ID(如果有)
- 将该 ID 注入请求管道,使其可供被调用的 api 使用
public class GetImpersonatorMiddleware
{
private readonly RequestDelegate _next;
private IImpersonatorRepo _repo { get; set; }
public GetImpersonatorMiddleware(RequestDelegate next, IImpersonatorRepo imperRepo)
{
_next = next;
_repo = imperRepo;
}
public async Task Invoke(HttpContext context)
{
//get user id from identity Token
var userId = 1;
int impersonatedUserID = _repo.GetImpesonator(userId);
//how to pass the impersonatedUserID so it can be picked up from controllers
if (impersonatedUserID > 0 )
context.Request.Headers.Add("impers_id", impersonatedUserID.ToString());
await _next.Invoke(context);
}
}
我找到了这个 ,但这并没有解决我正在寻找的问题。
如何传递参数并使其在请求管道中可用?在 header 中传递它是否可以,或者有更优雅的方法来做到这一点?
您可以使用 HttpContext.Items 在管道内传递任意值:
context.Items["some"] = "value";
更好的解决方案是使用范围服务。看看这个:Per-request middleware dependencies
您的代码应如下所示:
public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext, IImpersonatorRepo imperRepo)
{
imperRepo.MyProperty = 1000;
await _next(httpContext);
}
}
然后将您的 ImpersonatorRepo 注册为:
services.AddScoped<IImpersonatorRepo, ImpersonatorRepo>()
我正在使用 ASP.NET Core Web API
,其中我有多个独立的网络 api 项目。在执行控制器的任何操作之前,我必须检查登录用户是否已经在模拟其他用户(我可以从 DB
获得)并且可以将模拟用户 Id
传递给 actions
.
由于这是一段要重复使用的代码,我想我可以使用中间件:
- 我可以从请求中获取初始用户登录 header
- 获取模拟的用户 ID(如果有)
- 将该 ID 注入请求管道,使其可供被调用的 api 使用
public class GetImpersonatorMiddleware
{
private readonly RequestDelegate _next;
private IImpersonatorRepo _repo { get; set; }
public GetImpersonatorMiddleware(RequestDelegate next, IImpersonatorRepo imperRepo)
{
_next = next;
_repo = imperRepo;
}
public async Task Invoke(HttpContext context)
{
//get user id from identity Token
var userId = 1;
int impersonatedUserID = _repo.GetImpesonator(userId);
//how to pass the impersonatedUserID so it can be picked up from controllers
if (impersonatedUserID > 0 )
context.Request.Headers.Add("impers_id", impersonatedUserID.ToString());
await _next.Invoke(context);
}
}
我找到了这个
如何传递参数并使其在请求管道中可用?在 header 中传递它是否可以,或者有更优雅的方法来做到这一点?
您可以使用 HttpContext.Items 在管道内传递任意值:
context.Items["some"] = "value";
更好的解决方案是使用范围服务。看看这个:Per-request middleware dependencies
您的代码应如下所示:
public class MyMiddleware
{
private readonly RequestDelegate _next;
public MyMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext, IImpersonatorRepo imperRepo)
{
imperRepo.MyProperty = 1000;
await _next(httpContext);
}
}
然后将您的 ImpersonatorRepo 注册为:
services.AddScoped<IImpersonatorRepo, ImpersonatorRepo>()