使用单个或多个控制器URI调用Web API

rwk*_*iii 3 asp.net-mvc entity-framework asp.net-web-api

我见过的大多数Web API示例都以这种格式显示URI:

/api/values/   (returns all records)
/api/value/{id}    (returns a specific record)
Run Code Online (Sandbox Code Playgroud)

我可以想到我不喜欢这种URI约定,但对于我目前的项目来说,它是完美的.虽然,它不适合我,我不知道我能做些什么来实现这一点.对我来说,我可以有一个或另一个 - 单数或复数.

如果我的控制器类名为ValuesController,那么我的Web API就是

/api/values/
/api/values/{id}
Run Code Online (Sandbox Code Playgroud)

如果我的控制器类名为ValueController,那么我的Web API就是

/api/value/
/api/value/{id}
Run Code Online (Sandbox Code Playgroud)

我使用ADO.NET实体数据模型在模型设计器中创建了几个实体.所有都有一个单一的命名约定.例如,活动,州,国家,用户等.尽管如此,EF似乎创建了多个数据库表.

我为每个实体创建了APIControllers.我已经尝试了2个控制器的命名约定 - 复数和单数,但我没有看到URI的预期(和期望)结果.无论我尝试什么,复数和单一的Web API总是相同的.

仅供参考,我刚检查了自动创建的默认API(ValuesController).要返回所有记录,我必须指定/ api/values /并返回单个记录,我必须指定/ api/values/{id} - 两者都是复数,我确定默认情况下不是这样.

这有什么影响?配置/识别复数和单数的URI的区分形式的逻辑在哪里?

Mar*_*ulz 5

在Web API RouteConfig.cs文件中配置的默认路由指定了一个名为的参数controller,类似于:

routes.MapHttpRoute("Default", "api/{controller}/{id}",
    new { id = RouteParameter.Optional };
Run Code Online (Sandbox Code Playgroud)

当你打电话给任何一个/api/values/api/values/{id},你的控制器的路线值将values在两种情况下.因此,Web API按照惯例解析的控制器将是ValuesController.

(请注意,没有执行任何自动复数.IHttpControllerSelector如果您真的想要实现该行为,您可以实现自定义.但我强烈建议您不要这样做.)