我们有一个名为 IContext 的接口,它基本上是 IHttpContextAccessor 的抽象,能够从请求标头中获取令牌和声明。因此我们可以从每个 http 请求中得到我们想要的任何声明。到目前为止一切都很好,但是当我们从 rabbitmq 消费事件时,因为它不是 http 请求,没有 HttpContext(null) 也没有标头,所以我们需要在事件消息中传递令牌,当我们消费消息时,我们需要传递再次标记其他方法,因为在这些方法中可以使用 http 请求,我们必须添加令牌请求标头。
所以我真的不想在每个方法中都将令牌作为参数传递,我希望能够通过 IContext 接口获取令牌或声明。
我尝试在消费事件时创建一个 DefaultHttpContext 实例。我将能够将通过事件发送的令牌添加到上下文标头,并且 IContext 接口将能够通过 IHttpContextAccessor 获取令牌。
public async Task Consume(ConsumeContext<T> context)
{
var defaultHttpContext = new DefaultHttpContext();
_httpContextAccessor.HttpContext = defaultHttpContext;
_httpContextAccessor.HttpContext.Request.Headers.Add("Authorization", "Bearer token");
_context = context;
try
{
await Consume(context.Message, context.CancellationToken);
}
catch (Exception ex)
{
throw ex;
}
}
我通常在单元测试中看到 DefaultHttpContext,老实说,我的解决方案并不令我满意,因为创建 HttpContext 对象可能会导致性能下降,而我不知道。
任何建议或建议都很好,谢谢