gpt4 book ai didi

asp.net-core - AsyncLocal 没有到达 Controller

转载 作者:行者123 更新时间:2023-12-05 00:54:20 26 4
gpt4 key购买 nike

我不太了解这种情况,其中 AsyncLocal instance设置在 AuthenticationHandler 中的某个点,但没有到达 Controller ,当它被注入(inject) constructor .

我已经使它类似于 IHttpContextAccessor工作,但仍然远不及。但是,如果我从 Middleware 设置 AsyncLocal ,它到达 Controller 。此外,从 AuthenticationHandler 设置 HttpContext.Items 属性工作得很好。

问题:HttpContext 如何能够一直保留 Items 属性内容,以及 ASP.NET 运行时是否因为某些安全原因而将捕获的 DomainContextAccessor 的 ExecutionContext 设置在哪里?

我做了一个sample app演示这个用例。我真的很感谢有人能阐明这个问题。

最佳答案

关于“我应该如何解决这个问题”,您已经有了一个很好的答案。这里有更多关于它为什么会这样表现的描述。

AsyncLocal<T>logging scopes 具有相同的语义.因为它具有相同的语义,所以我总是喜欢将它与 IDisposable 一起使用。 ,因此范围清晰明确,并且没有关于方法是否标记为 async 的奇怪规则与否。

有关奇怪规则的详细信息,请参阅 this .总结:

  • 将新值写入 AsyncLocal<T>在当前范围内设置该值
  • 方法标记为 async将在第一次写入时将其范围复制到新范围(并且修改的是新范围)。

I've made it similar to how IHttpContextAccessor works, but still nowhere near.

不建议抄袭IHttpContextAccessor的设计.它适用于那个非常具体的用例。如果你想使用 AsyncLocal<T> ,然后使用这样的设计:

static class MyImplicitValue
{
private static readonly AsyncLocal<T> Value = new();

public static T Get() => Value.Value;

public static IDisposable Set(T newValue)
{
var oldValue = Value.Value;
Value.Value = newValue;
return new Disposable(() => Value.Value = oldValue);
}
}

用法:

using (MyImplicitValue.Set(myValue))
{
// Code in here can get myValue from MyImplicitValue.Get().
}

您可以将其包装成 IMyImplicitValueAccessor如果需要,但请注意任何“setter”逻辑都应使用 IDisposable如图所示。

AsyncLocal instance is set at a certain point in the AuthenticationHandler, but does not reach the controller

这是因为您的 AuthenticationHandler 设置了该值,但在设置该值后不调用 Controller (它不应该)。

However, if I set the AsyncLocal from a Middleware, it reaches the controller.

这是因为中间件会调用下一个中间件(最终到达 Controller )。即,中间件的结构如下:

public async Task InvokeAsync(HttpContext context)
{
using (implicitValue.Set(myValue))
{
await _next(context);
}
}

所以 Controller 在AsyncLocal<T>的范围内值已设置。

How is HttpContext able to retain Items property contents all the way

Items只是一个属性包。和 AsyncLocal<T> 没有任何关系.它存在是因为它是 HttpContext 上的属性,并且它仍然存在,因为相同的 HttpContext在整个请求中使用实例。

is ASP.NET runtime disposing the captured ExecutionContext of my DomainContextAccessor for some security reason because of where it is being set at?

不完全是。 AsyncLocal<T>设置得很好;只是 Controller 没有在 AsyncLocal<T> 的范围内被调用正在设置中。

关于asp.net-core - AsyncLocal<T> 没有到达 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66500737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com