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

时间:2013-11-26 15:44:01

标签: c# asp.net-mvc routes asp.net-mvc-routing async-await

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

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

public async Task<ActionResult> IndexAsync()

因此,如果我们转到http://somedomain.xyz/WhicheverController http://somedomain.xyz/WhicheverController/Index,我们会收到404.

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

这是以前的MVC异步控制器方法的遗留物,通常需要IndexComplete方法才能工作,但是使用基于任务的异步控制器方法,不需要匹配的XxxxComplete方法,但是观察到Async惯例。

AsyncController的实际实现相当稀疏:

public abstract class AsyncController : Controller
{
}

因此,在MVC堆栈的某处,测试控制器的类型,并打开特殊的路由魔法。

答案 1 :(得分:3)

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

只需将方法的返回类型更改为async Task<ActionResult>即可异步执行操作。

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

示例

以下操作使用默认路由

异步工作
public class HomeController : Controller
{
    public async Task<ActionResult> 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 }
        );
    }
}

答案 2 :(得分:0)

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

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