【发布时间】:2015-04-21 15:54:48
【问题描述】:
在我正在处理的一个副项目中,我正在使用 WebAPI 2.2 创建一个 RESTful API。我正在做的事情是一种访问游戏设置的方法。我尝试完成的路线示例如下:
http://x/api/GameSettings/ <-- Returns all settings
http://x/api/GameSettings/audio <-- Returns the 'audio' category
http://x/api/GameSettings/audio/volume <-- Returns the key 'volume' in category audio
注意:示例都是Get请求。
我已经实现了以下控制器...
public class GameSettingsController : ApiController
{
// GET /api/GameSettings
public HttpResponseMessage Get()
{
// Magic
return Request.CreateResponse(HttpStatusCode.OK, model);
}
public HttpResponseMessage Get(string category)
{
// Similar.
}
public HttpResponseMessage Get(string category, string key)
{
// Slightly different, but still similar.
}
}
我绑定了以下 MVC 路由:
// Only necessary for the main view...
routes.MapRoute(
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
而且,我绑定了以下 WebAPI 路由:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "ApiGeneralCommand",
routeTemplate: "api/{controller}",
defaults: new { controller = "GameSettings" }
);
config.Routes.MapHttpRoute(
name: "ApiCategoryCommands",
routeTemplate: "api/{controller}/{category})",
defaults: new { controller = "GameSettings" }
);
config.Routes.MapHttpRoute(
name: "ApiKeyCommands",
routeTemplate: "api/{controller}/{category}/{key}",
defaults: new { controller = "GameSettings", category = "master" },
constraints: new { key = "[a-z0-9.-]" }
);
...最后,我的Global.asax 配置设置如下:
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
...但是有一个小问题。
当我导航到 http://x/api/GameSettings/audio 时,我收到 404 错误。就好像请求中的 category 参数没有正确关联到我的控制器上的 Get(string category) 方法。这让我相信我的路线是错误的,或者我错过了一些东西。
作为健全性检查,我使用非 RESTful 语法 http://x/api/GameSettings?category=audio 测试了路由,它遇到了断点并产生了结果。这只是重申了我的理论,即 WebAPI 路由已关闭。
作为额外的完整性检查,我测试了http://x/api/GameSettings/,不仅命中了该函数中设置的断点,而且返回了预期的结果。
问题:我的路由缺少什么,这将使http://x/api/GameSettings/audio 像http://x/api/GameSettings?category=audio 一样工作?我有一段时间没有使用 RESTful API,所以我确定我错过了一些非常愚蠢的东西。
【问题讨论】:
标签: c# asp.net-mvc rest asp.net-web-api