1

我正在尝试编写 API。签名看起来像这样:

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

在默认情况下,我收到一个错误,说我的班级无法区分 Deal 和 Stand。经过一番研究,我发现这是一个路由问题。所以我决定更新我的路线。

我的 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});
    }
}

Going tohttp://localhost:54924/api/Cards/Stand/19会给出一个错误,指出没有找到 HttpResource,并且 going tohttp://localhost:54924/api/Cards/Stand会触发该NewGame()操作。如何让 Stand 和 Deal 在同一个控制器上工作?

4

2 回答 2

3

Web API 适用于 RESTful 路由。在 REST 中,您拥有资源和标准操作:GET、POST、PUT、PATCH 和 DELETE。这就是你的行为应该被命名的方式。Deal并且意味着在路由Stand中绝对注意。RESTful在设计 API 时,您应该考虑资源以及可以使用这些资源执行的标准 HTTP 动词。在 RESTful API 中,控制器代表您的资源,而 HTTP 动词是您希望对该资源执行的操作。

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

于 2012-12-15T23:09:16.383 回答
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 函数。与立场相同。

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

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

于 2012-12-15T23:15:24.430 回答