我有一个自托管的OWIN托管Web API项目,为我提供了一些基本的REST方法.
我想要多语言错误消息,所以我使用资源文件和BaseController将Thread.CurrentCulture和Thread.CurrentUICulture设置为请求的Accept-Language标头.
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
{
if (controllerContext.Request.Headers.AcceptLanguage != null &&
controllerContext.Request.Headers.AcceptLanguage.Count > 0)
{
string language = controllerContext.Request.Headers.AcceptLanguage.First().Value;
var culture = CultureInfo.CreateSpecificCulture(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
base.ExecuteAsync(controllerContext, cancellationToken);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但如果我使我的控制器方法异步,问题就出现了.
当我在方法中使用await时,它可能会在另一个线程中继续,因此我的CurrentCulture和CurrentUICulture会丢失.
这是我用来找到这个问题的一个小例子.
public async Task<HttpResponseMessage> PostData(MyData data)
{
Thread currentThread = Thread.CurrentThread;
await SomeThing();
if (Thread.CurrentThread.CurrentCulture != currentThread.CurrentCulture)
Debugger.Break(); …Run Code Online (Sandbox Code Playgroud) 这是一个两部分问题:
有人可以提供ASP.NET/.NET属性的列表,这些属性通常是与ExecutionContext一起流动的线程本地吗?
HttpContext.Current?Thread.CurrentContext?Thread.CurrentPrincipal中?Thread.CurrentCulture?
我可以依靠什么属性来存活/持续异步/等待?
还有什么?
有没有办法添加将使用ExecutionContext自动流动的特定于应用程序的上下文信息?就像是
var ec = ExecutionContext.Capture();
ec.CustomContext["MyCustomContext"] = ACustomContext;
Run Code Online (Sandbox Code Playgroud)