MVC4 API路由进入第一个操作

时间:2012-12-15 22:57:33

标签: c# api asp.net-mvc-4 asp.net-mvc-routing

我正在尝试编写API。签名如下所示:

public class CardsController : ApiController
{
    [HttpGet]
    public ClientData NewGame(){...}
    [HttpGet]
    public ClientData Deal(int sessionId){...}
    [HttpGet]
    public ClientData Stand(int sessionId){...}
}

其他一切都是默认的,我收到一个错误,说我的班级无法区分交易和支持。经过一番研究后,我发现这是一个路由问题。所以我决定更新我的路由。

我的global.asax.cs现在看起来像这样:

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();
        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute("api", "api/{controller}/{action}/{value}", new { value = RouteParameter.Optional});
    }
}

转到http://localhost:54924/api/Cards/Stand/19会出现错误消息,指出未找到HttpResource,并转到http://localhost:54924/api/Cards/Stand会触发NewGame()操作。如何让Stand和Deal在同一个控制器上工作?

2 个答案:

答案 0 :(得分:3)

Web API与RESTful路由一起使用。在REST中,您可以使用它们进行资源和标准操作:GET,POST,PUT,PATCH和DELETE。这就是你的行为应该被命名的方式。 DealStand表示在RESTful路由中绝对注意到。在设计API时,您应该考虑资源和可以使用这些资源执行的标准HTTP谓词。在RESTful API中,控制器代表您的资源,HTTP谓词是您要对此资源执行的操作。

如果您要违反Web Api路由中内置的默认RESTful约定,则必须修改路由设置并在其中包含{action}名称。然后,您可以根据需要为自己的行为命名。请记住,如果您正在设计API,则会有消费者遵守的标准。如果你想重新发明轮子,请确保你有非常好的API文档。

答案 1 :(得分:1)

添加路线:

routes.MapHttpRoute("DealApi", 
                    "api/{controller}/deal/{sessionId}",
                    new { action="Deal", sessionId = RouteParameter.Optional });


routes.MapHttpRoute("StandApi", 
                    "api/{controller}/stand/{sessionId}",
                    new { action="Stand", sessionId = RouteParameter.Optional });

现在,在您的Controller类中:

[HttpGet]
[ActionName("Deal")]
public ClientData Deal(int sessionId){...}

[HttpGet]
[ActionName("Stand")]
public ClientData Stand(int sessionId){...}

现在,无论何时拉出网址http://www.yourhost.com/api/deal/12345,都会调用Deal函数。与Stand相同。

请记住,您在路线表中设置的任何内容仅用于识别网址是否有效。通过在第三个参数中指定操作,您将告诉Web Api找到一个ActionName属性设置为您指定的函数。

另一件事 - 将这两条路线放在任何默认的api路线之前。