我正在使用Thread来存储Locale并将其向下传递到层。
在我的中间件中,我在当前线程中设置所选的区域设置如下:
Thread.SetData(Thread.GetNamedDataSlot('SelectedLocale'), selectedLocale /* I get this value form the request */);
然后在我的代码的其余部分中,我使用这一行来访问数据:
var selectedLocale = Thread.GetData(Thread.GetNamedDataSlot('SelectedLocale'));
然而,这有时有效,有时会返回null。
我使用了var threadId = Thread.CurrentThread.ManagedThreadId
,并意识到Id有时会发生变化。
为什么会这样?如何确保在处理请求时使用同一个线程?
更新
我在我的API和RazorPage应用程序中使用了相同的技术。
我的API工作得很好。他们从不失败。
然而,我的Razor Page应用程序几乎70%的时间都会失败。但它们有时也会起作用。
我想这里一定有与剃刀页有关的东西。
我正在使用Thread来存储Locale并将其向下传递到层。
我的代码中没有使用async/await
如果你仍然在线程中思考,而没有使用async/await,那么你做得不对。线程是一个太低级的构造,不能用于应用程序代码,尤其是web应用程序代码。
现在都是任务和上下文。如果使用Razor页面,框架将异步处理的内容。只需使用HttpContext将实体从一个中间件传递到下一个中间件。
尽管HttpContext也有自己的问题。
更多阅读:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0,https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0.