我有一个搜索操作,它有两个路径,一个只返回一个简单视图的同步路径,一个异步路径,它以异步方式执行搜索,然后返回一个视图。两者都是GET请求,因此它们是同一行动的一部分。
问题是,当我访问“localhost:XXXX / Home / Search”操作时,页面无限加载。使用Fiddler,我可以看到请求永远不会返回。我调试了它,它使它到最后一行代码,但是,请求再次没有完成。
我已将repro简化为以下内容:
public async Task<ActionResult> Search()
{
return View();
}
VS11警告我代码将在没有等待的情况下同步运行,这很好,但请求没有完成。
这应该有用吗?或者我需要在这里做点什么吗?
修改
这是针对.NET 4.5的MVC 4。
修改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
}
答案 0 :(得分:17)
这是测试版中的已知错误。 To quote Stephen Toub:
简短的回答是.NET 4.5 Beta中的ASP.NET MVC中存在一个已知错误,当异步方法同步完成时会导致此问题。在修复程序可用之前,一个简单的解决方法是添加“await Task.Yield();”作为异步方法的第一行,强制它异步完成。为了使其正常工作,您还需要确保在.NET 4.5中使用ASP.NET提供的新SynchronizationContext,这意味着确保您拥有该行:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
在配置文件的appSettings部分。