ApiController 类如何工作和行为
本文关键字:工作 何工作 ApiController | 更新日期: 2023-09-27 18:31:08
我研究了如何在MVC项目中使用API,但我对此有一些疑问。(在有人问之前,我正在用 C# 语言编写)。
到目前为止,我知道 API 的路由配置是在 WebApiConfig
类中设置的,默认情况下路由是:
routeTemplate: "api/{controller}/{id}"
通过这样做,当我编译jSon请求时,我知道我必须调用什么URI才能获得特定结果。
但我想更具体一点,所以我将 API 的路由修改为:
routeTemplate: "api/{controller}/{action}/{id}"
通过这条路线,我将能够直接在我的 ApiController 中为特定操作(方法?)构建一个 URI。
我还了解到,在使用 jSoon 构建 URI 时,/{controller}/
是类的名称。也就是说,如果类ProductsController
我必须用于构建 URI 的控制器名称只是 /products
.(所以整个 URL 将被/api/products
)。
这里的问题是:
如果我有一个仅名为 Products
的 ApiController 类,它是否可以识别为 URI 的一部分?还是 ApiController 类必须以"控制器"结尾?
通过遵循教程,我将我的 ApiController il 与其他控制器相同的文件夹。我知道可以将 Apis 放入不同的文件夹中。那么,每个 API 都会被 MVC 自动识别吗?我的意思是,无论我在哪里保存它们,它们都被认为是 API 吗?
如果是这样,我最终可以调用与我正在处理的项目不同的项目中的 API 吗?
是否可以创建具有 API 集合的单个项目(作为类库)?
如果我想在不同项目中调用 API,路由配置是否会更改?
哦,这是很多问题... :)
要回答他们:
如果我有一个名为"产品"的 ApiController 类,它是否可以识别为 URI 的一部分?还是 ApiController 类必须以"控制器"结尾?
ASP.NET 路由使用该 Coonvention,所以,据我所知,如果您随心所欲地命名类,不遵循该约定,它们将无法识别,并且您很可能会得到 404。所以要回答你的问题,是的,名称必须以 Controller
结尾,除非您覆盖默认约定(参见 Mike Goodwin 答案)。
按照教程,我将我的 ApiController 放在与其他控制器相同的文件夹中。我知道可以将 Apis 放入不同的文件夹中。那么,每个 API 都会被 MVC 自动识别吗?我的意思是,无论我在哪里保存它们,它们都被认为是 API 吗?
文件夹无关紧要,ASP.NET 将查找与名称匹配的类。API 控制器被识别为 API 控制器,因为它们继承自基本 ApiController 而不是控制器
如果是这样,我最终可以调用与我正在处理的项目不同的项目中的 API 吗?是否可以创建具有 API 集合的单个项目(作为类库)?如果我想在不同项目中调用 API,路由配置是否会更改?
这不清楚..."调用"API 是什么意思?如果 API 在另一个项目中,它可能会位于一个单独的地址上......您所需要的只是将 JSON 请求定向到该地址,因此如果您使用的是 jQuery,请执行以下操作:
$.getJSON('http://other.server/api/Controller', function(data) { ... });
而不是简单地这个:
$.getJSON('/api/Controller', function(data) { ... });
(只是要注意跨站点脚本问题)。
希望能为您解决问题。随意问一些不合时宜的事情是否有意义......
在 ASP.Net MVC 中,可以通过实现自定义控制器工厂来完全控制控制器位置和实例化。
这是一个实现IControllerFactory
接口的类。这提供了基于传入请求上下文选择和实例化控制器的方法。它还具有其他控制器生命周期行为的方法。
您在标准 MVC 中看到的基于名称约定的行为只是编码到默认控制器工厂中的逻辑(
有趣的是,它的类型DefaultControllerFactory
下面是如何进行客户控制器工厂的示例:
http://www.mgolchin.net/posts/18/dive-deep-into-mvc-icontrollerfactory
所以你的问题的答案是肯定的,你可以做任何你想做的事情,但不,它并不完全是自动的。