gpt4 book ai didi

c# - 为什么 AsyncLocal 不从 OWIN 中间件流向 WebForms 页面?

转载 作者:太空狗 更新时间:2023-10-29 21:59:50 25 4
gpt4 key购买 nike

查找演示此问题的完整示例应用程序 here .

我正在尝试使用 OWIN 中间件填充 WebForms 页面可访问的静态标识符,但我注意到对于某些类型,这并不直观 - 特别是 AsyncLocal<T> .

考虑以下工作示例,使用 int :

简单的静态容器

public static class Container
{
public static int CallId { get; set; }
}

简单的 OWIN 配置

[assembly: OwinStartup(typeof(Startup))]

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
Container.CallId = 5;

return next.Invoke();
});
}
}

简单的 Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
if (Container.CallId != 5)
{
throw new Exception("What happened to CallId");
}
}

这按预期运行。中间件集 CallId到 5,WebForms 页面看到一个 5。没有抛出异常。


如果我想使用 AsyncLocal<int>,这就是事情打破直觉的地方对于我的 CallId,该值在 WebForms 页面中不再可用。例如

容器破损

public static class Container
{
public static AsyncLocal<int> CallId { get; set; }
}

损坏的 OWIN 配置

[assembly: OwinStartup(typeof(Startup))]

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use((context, next) =>
{
AsyncLocal<int> asyncId = new AsyncLocal<int>();
asyncId.Value = 5
Container.CallId = asyncId;

return next.Invoke();
});
}
}

损坏的 Default.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
if (Container.CallId.Value != 5)
{
throw new Exception("What happened to CallId");
}
}

没有按预期运行。标识符在中间件中创建,但在页面中不可用。 抛出异常

为什么?

我正在努力拼凑为什么这次更新打破了直觉;我想不出任何可能导致值(value)消失的事情。

  • 进程、域和线程 id 在中间件组件执行和 webform 页面的 On_Load 之间都保持不变。 .
  • Container是静态的,因此域中只存在一个实例。
  • 行为上的差异并不取决于原始类型还是引用类型;我用一个简单的 MyType 尝试了同样的事情, CallId不返回 null在网络表单中

静态哪里去了CallId值(value)何去何从?

如果您想亲眼看看,这里有一个 demo github repo .

最佳答案

你用错了。使用本地保存所需的值。

public static class Container {
private static AsyncLocal<int> current = new AsyncLocal<int>();

public static int CallId {
get {
return current.Value;
}
set {
current.Value = value;
}
}
}

OWIN 配置保持不变。

[assembly: OwinStartup(typeof(Startup))]
public class Startup {
public void Configuration(IAppBuilder app) {
app.Use((context, next) => {
Container.CallId = 5;
return next.Invoke();
});
}
}

AsyncLocal<T>类现在将在跨线程的异步流中保留该值。

关于c# - 为什么 AsyncLocal 不从 OWIN 中间件流向 WebForms 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778597/

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