题
我有一个有两个路径的搜索操作,一个同步路径,刚刚返回一个简单的视图,以及异步路径,它异步地搜索,然后返回视图。两者都得到了请求,因此它们是相同行动的一部分。
问题是,当我访问动作“localhost:xxxx / home / search”时,页面只是无限加载。使用Fiddler,我可以看到请求永远不会返回。我调试它并使其到最后一行代码,但是,再次,请求不完整。
我简化了以下重复:
public async Task<ActionResult> Search()
{
return View();
}
.
vs11警告我,代码将同步运行,没有等待,这很好,但请求未完成。
应该这项工作吗?或者我需要在这里做别的什么吗?
编辑
这是MVC 4定位.NET 4.5。
编辑2
对于那些在代码中看到的东西的人,这就是我在异步动作中需要同步的原因:
.public async Task<ActionResult> Search(string query = null)
{
if (string.IsNullOrWhiteSpace(query))
return View(new SearchViewModel()); // never loads
var model = await _someService.SearchAsync(query);
return View(model); // loads
}
解决方案
这是测试版中的已知错误。 quote stephen toub:
简短的答案是,在.NET 4.5 Beta中存在ASP.NET MVC中的已知错误,当ASYNC方法同步完成时,在此问题中导致此问题。在修复之前,简单的解决方法是添加“等待任务”();“作为Async方法的第一行,强制它以异步完成。为此,您还需要确保在.NET 4.5中使用ASP.NET提供的新同步Context,这意味着确保您有线:
.<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
在配置文件的AppSettings部分。