【发布时间】:2014-10-08 06:49:17
【问题描述】:
很简单,我已经将一些同步登录操作转换为异步,现在找不到它们,得到 404。
public async Task<ActionResult> BetaLoginAsync()
{
return View();
}
[HttpPost]
public async Task<ActionResult> BetaLoginAsync(Models.Authentication.SimpleLoginModel loginModel, string returnUrl)
{
if (this.ModelState.IsValid)
{
if (await this.ValidateCredentialsAsync(loginModel))
{
...
我以为我已经完成了所有需要的,我遵循了这个:
http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
编译器警告我,第一个只返回视图的操作方法没有使用 await 关键字,因此它将同步运行。
问题是当我删除async 关键字时,它根本无法编译。编译器说调用View返回的类型ViewResult不能隐式转换为类型Task<ActionResult>。
现在,如果我让它同步但保留我的HttpPost 回发登录验证方法异步,那么当我单击提交按钮时,MVC 路由不会调用它,而是发布到只返回视图的同步版本!!
我以前使用过异步操作,但我不知道为什么今天我在挣扎。
当有两个同名/重载的操作方法时,这是一个错误吗??
有人知道怎么回事吗?
更新 1
好吧,这很奇怪。
当控制器子类化 AsyncController 时它可以工作,但这不应该是它在 MVC 4+ 中的工作方式。
我应该在 ASP.NET MVC 4 中使用 AsyncController 吗?
我正在运行 MVC 5,或者应该是。我已经有……年没有创建 MVC 3 项目了。
我需要做更多调查然后回来。
更新 2
我有一个答案,但没有真正理解为什么。我尝试了 Chris 的建议,即从操作中删除 Async 后缀,它奏效了。
奇怪的是,如上所述,它在使用 MVC 3 中的“旧”AsyncController 时有效。
我想这就是现在的样子。
【问题讨论】:
-
您能告诉我们您发送到服务器的
GET和POST。您是否更新了您正在使用的网址以包含Async后缀?顺便说一句,Async后缀不是必需的。它只是用于演示代码。 -
Async后缀是 convention。只有当被调用的方法实际上是异步执行时才应该添加它。 -
嗨 Jeff,在 MVC 5 的情况下(使用最近的
Controller类),似乎可以忽略这个约定;路由不会“看到”附加了“异步”的操作。
标签: c# asp.net-mvc asp.net-mvc-4 asynchronous