asp.net – 与WebAPI异步时保留HttpContext(中等信任)
|
我正在构建一组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,并且在调用TestOutput的每个点上HttpContext.Current都不为null.我没有成功地使用我尝试的任何东西进行“In Task”调用.另外在我的一些测试线程中,id永远不会变化,这表明我已经有效地删除了该方法的异步性.如何确保在每次调用TestOutput时都保留culture和HttpContext.Current,并且代码可以在不同的线程上自由运行? 在闭包中捕获HttpContext.Current然后再次设置它将不适合我,因为我需要支持Medium Trust,它会在调用HttpContext.Current setter时抛出安全异常. 解决方法等待任务时,将保留上下文.你所看到的是没有线程池任务的上下文(Task.Run,TaskFactory.StartNew,或者对于BackgroundWorker或Thread或Delegate.BeginInvoke).这是正常的和预期的. 所以,不要使用线程池任务.您的示例代码似乎想要使用具有HttpContext的多个线程进行并行处理,这是不可能的. 如果需要,可以执行并发异步方法,但这要求您的Thread.Sleep实际上可以是异步方法而不是基于CPU的方法: [HttpGet]
public async Task<IEnumerable<string>> Test()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var output = new List<string> { TestOutput("Action start") };
var task = SlowStringAsync();
output.Add(TestOutput("Action Mid"));
output.Add(await task);
output.Add(TestOutput("Action end"));
return output;
}
public async Task<string> SlowStringAsync()
{
await Task.Delay(1000);
return TestOutput("In Task");
}
如果您的旧库不受您的控制,并且您无法使其异步,那么您必须同步调用它.在以下情况下从异步方法调用同步方法是可以接受的: [HttpGet]
public async Task<IEnumerable<string>> Test()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var output = new List<string> { TestOutput("Action start") };
output.Add(TestOutput("Action Mid"));
Thread.Sleep(1000);
output.Add(TestOutput("Not Really In Task"));
output.Add(TestOutput("Action end"));
return output;
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 在Controller或其他地方渲染部分字符串
- asp.net-mvc – 保持viewdata在RedirectToAction
- asp.net-mvc-3 – Autofac等同于Ninject的WhenInjectedInto
- asp.net Xml绑定到数据控件的具体实现
- asp.net-web-api – 可以从Request对象获取当前的MediaType
- asp.net – 如何设置通配符(*)子域?
- asp.net-mvc-3 – Html.Action – 获取与发布
- asp.net-mvc – 是否可以使用实体框架代码首先设置唯一的约
- asp.net-mvc – 如何在窗体发布后检查我的视图中的TempData
- asp.net-mvc – web.config在哪里用于MVC应用程序?
- asp.net-mvc – 为什么DisplayFormat DataFormat
- 免费构建.NET服务器
- asp.net-mvc – 向RouteValueDictionary添加复杂
- asp.net-mvc – ASP.NET MVC – CustomeAuthoriz
- asp.net-core – 如何根据ASP.NET Core中的解决方
- asp.net – 你如何确定哪个验证器失败?
- asp.net-mvc – ASP.NET MVC Route,在控制器之前
- asp.net AJAX实现无刷新获得数据
- asp.net-mvc – ServiceStack应该是MVC应用程序中
- asp.net – 使用ItemType进行强类型转发器控制?
