我正在构建一组 ASP.Net 托管的 WebAPI 服务,这些服务必须使用严重依赖于 HttpContext.Current 的旧库。我无法确保在参与异步调用的所有方法中都保留上下文。我在下面的代码中尝试了 await/Task.Wait 和 TaskScheduler.FromCurrentSynchronizationContext() 的几种变体。
[HttpGet]
public Task<IEnumerable<string>> ContinueWith()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); //or another culture that is not the default on your machine
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var output = new List<string> { TestOutput("Action start") };
var task = Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
return TestOutput("In Task");
}).ContinueWith(slowString =>
{
output.Add(slowString.Result);
output.Add(TestOutput("Action end"));
return output as IEnumerable<string>;
});
output.Add(TestOutput("Action Mid"));
return task;
}
private string TestOutput(string label)
{
var s = label + " ThreadID: " + Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture);
s += " " + Thread.CurrentThread.CurrentCulture.EnglishName;
s += HttpContext.Current == null ? " No Context" : " Has Context";
Debug.WriteLine(s);
return s;
}
我希望能够确保 CurrentCulture 是 fr-FR,并且 HttpContext.Current 在调用 TestOutput 的每个点都不为空。对于我尝试过的任何东西,我都没有成功地为“任务中”调用做到这一点。同样在我的一些测试线程中,id 永远不会改变,这表明我已经有效地删除了该方法的异步性。如何确保在每次调用 TestOutput 时都保留区域性和 HttpContext.Current,并且代码可以在不同的线程上自由运行?
在闭包中捕获 HttpContext.Current 然后简单地再次设置它对我来说不起作用,因为我需要支持中等信任,这将在调用 HttpContext.Current 设置器时引发安全异常。