任务异步控制器方法没有命中

所以,我们有一个MVC项目,已经通过不同版本的MVC从1升级到4。

现在我们有一个控制器方法:

public async Task IndexAsync() 

所以,如果我们去http://somedomain.xyz/WhicheverController http://somedomain.xyz/WhicheverController/Index ,我们将迎来404。

http://somedomain.xyz/WhicheverController/IndexAsync路由到方法就好了。

我们的路由出了什么问题?

我相信如果您从AsyncController派生Controller,那么您的示例将会起作用。

 public class MyController:AsyncController { public async Task IndexAsync() { return View(); //view called "Index.cshtml", not "IndexAsync.cshtml" } } 

所以现在你可以在没有Async后缀的情况下点击~/My/Index ,尽管Async出现在控制器名称中。

这是来自先前MVC异步控制器方法的IndexComplete ,并且通常需要IndexComplete方法才能工作,但是使用基于任务的异步控制器方法,不需要匹配的XxxxComplete方法,但观察到Async约定。

AsyncController的实际实现相当稀疏:

 public abstract class AsyncController : Controller { } 

因此,在MVC堆栈中的某个位置,测试控制器的类型,并打开特殊的路由魔术。

没有约定将异步操作映射到具有Async后缀的方法。 如果要在操作名称中使用Async后缀,则必须修改路由。

只需将方法的返回类型更改为async Task就足以异步执行操作。

Async后缀只是一个命名约定。 任何MVC框架都不会预期或执行它。

以下操作使用默认路由异步工作

 public class HomeController : Controller { public async Task Index() { await Task.Delay(1000); ViewBag.Message = "Modify this template to jump-start blah .. blah"; return View(); } ... } public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 

路由工作正常,在asp.net mvc 5中你不再需要Async后缀来执行操作,你应该删除它。

只需链接两个异步执行一个作业的操作(操作方法和操作结果),就需要此约定。 使用asp.net mvc 5中的新异步模型,您不再需要此Async约定。 就像inheritance自AsyncController一样。