这些名称/映射来自哪里?

时间:2016-06-24 03:29:08

标签: c# asp.net asp.net-web-api2

我正在浏览ASP.Net网站上的ASP.Net Web API getting started tutorial

我编写了这个例子,我理解了我所做的一切。我对C#非常有经验,但之前从未接触过任何ASP.Net。

在示例中,我们创建了一个Product类和一个ProductsController : ApiController类。这一切都很好。

当我导航到/api/products时,会列出定义的产品,当我导航到/api/products/id时,会列出带有该ID的产品。

这一切从何而来?该类名为Product,一个名为ProductsController,因此我不知道“product s ”的来源。此外,我尝试将GetAllProducts()GetProduct(int)重命名为随机内容,仍然有效

那么这里发生了什么?作为来自桌面C#开发的人,我无法看到这些事物之间的连接在哪里,我无法看到如何制作我自己的API,如/api/foo/bar,它可以执行任意操作。

2 个答案:

答案 0 :(得分:1)

因为命名转换会为您创建路径。您的ProductsController课程会提供/products部分,GetAllProducts会提供HTTP方法GET,因此请求/api/products会触及相应的方法。即使您将GetAllProducts重命名为Get123,它仍然有效,因为web-api只关注Get关键字并且没有参数。

GetProduct(int id)是一样的,唯一的区别是它有一个参数。这就是为什么它被/api/products/1击中的原因。 web-api选择它作为请求URL的最佳匹配(通过反射)。同样,如果您将其重命名为Get123(int id),它仍然有效。

以上是默认的命名转换路由。您始终可以通过RouteAttribute修改它们。

答案 1 :(得分:1)

WebAPI支持一组预定义的命名约定,以确定将请求路由到的正确控制器。

首先,采用默认路由配置:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

WebAPI将执行以下步骤以尝试确定要执行的操作:

  • 要查找控制器,Web API会将Controller添加到{controller}变量的值(即将products转换为ProductsController)。
  • 要查找操作,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。例如,对于GET请求,Web API会查找以Get...开头的操作,例如GetProductGetAllProducts。此约定仅适用于GET,POST,PUT和DELETE方法。
  • 路径模板中的其他占位符变量(例如{id})将映射到操作参数。

您可以在此处找到更多信息:Routing in ASP.NET Web API