C# ApicController类如何工作和行为?

C# ApicController类如何工作和行为?,c#,asp.net-mvc,api,asp.net-web-api,C#,Asp.net Mvc,Api,Asp.net Web Api,我研究了如何在MVC项目中使用API,但我对它有一些疑问。(在有人问我之前,我正在用C语言写作) 到目前为止,我知道Api的路由配置是在WebApiConfig类中设置的,默认路由是: routeTemplate: "api/{controller}/{id}" 通过这样做,当我编译一个jSon请求时,我知道为了获得一个特定的结果必须调用什么URI。 但我想说得更具体一些,所以我修改了Api的路径: routeTemplate: "api/{controller}/{action}/{id}"

我研究了如何在MVC项目中使用API,但我对它有一些疑问。(在有人问我之前,我正在用C语言写作)

到目前为止,我知道Api的路由配置是在
WebApiConfig
类中设置的,默认路由是:

routeTemplate: "api/{controller}/{id}"
通过这样做,当我编译一个jSon请求时,我知道为了获得一个特定的结果必须调用什么URI。
但我想说得更具体一些,所以我修改了Api的路径:

routeTemplate: "api/{controller}/{action}/{id}"
通过这种途径,我将能够直接构建一个URI到我的ApicController中的特定操作(方法?)

我还了解到,在使用jSon构建URI时,
/{controller}/
是类的名称。也就是说,如果类是
ProductsController
,那么构建URI时必须使用的控制器名称就是
/products
。(因此整个URL将是
/api/products

以下问题是:
如果我有一个名为just
Products
的ApiController类,它是否可以识别为URI的一部分?或者ApiController类必须以“Controller”结尾?

通过遵循教程,我将我的ApiController il放在与其他控制器相同的文件夹中。我知道可以将API放入不同的文件夹中。所以,每个API都是MVC自动识别的吗?我的意思是,无论我在哪里保存它们,它们都被识别为API吗?
如果是这样的话,我最终能否调用位于与我正在处理的项目不同的项目中的API?
我可以使用API集合创建单个项目(作为类库)吗?

如果要在不同的项目中调用API,路由配置是否会更改?

在ASP.Net MVC中,您可以通过实现自定义控制器工厂来完全控制控制器位置和实例化

这是一个实现
IControllerFactory
接口的类。这提供了基于传入请求上下文选择和实例化控制器的方法。它还具有用于其他控制器生命周期行为的方法

您在标准MVC中看到的基于名称约定的行为只是编码到默认控制器工厂中的逻辑(非常有趣,它的类型是
DefaultControllerFactory

下面是一个如何在工厂中执行客户控制器的示例:


所以你的问题的答案是肯定的,你可以做任何你想做的事,但是不,这不是全自动的。

哦,那是很多问题……:)

要回答这些问题:

如果我有一个名为justproducts的ApiController类,它是否可以识别为URI的一部分?或者ApiController类必须以“Controller”结尾?

ASP.NET路由使用这种协同转换,因此,据我所知,如果您随意命名该类,而不遵循该约定,它们将不会被识别,您很可能会得到404。因此,要回答您的问题,是的,名称必须以
Controller
结尾,除非您覆盖默认约定(请参阅Mike Goodwin答案)

根据教程,我将ApicController与其他控制器放在同一文件夹中。我知道可以将API放入不同的文件夹中。那么,MVC会自动识别每个API吗?我的意思是,无论我在哪里保存它们,它们都会被识别为API吗?

文件夹不重要,ASP.NET将查找与名称匹配的类。Api控制器被识别为Api控制器,因为它们继承自基础而非基础

如果是这样的话,我最终能否调用位于与我正在处理的项目不同的项目中的API?我可以用一组API创建一个项目(作为类库)吗? 如果要在不同的项目中调用API,路由配置是否会更改?

这还不清楚。。。“调用”API是什么意思?如果API在另一个项目中,它可能位于一个单独的地址上。。。您只需将JSON请求定向到该地址,因此如果您使用jQuery,请执行以下操作:

$.getJSON('http://other.server/api/Controller', function(data) { ... });
而不仅仅是这样:

$.getJSON('/api/Controller', function(data) { ... });
(请注意跨站点脚本问题)


希望这能帮你解决问题。请随意询问desnt是否有意义…

这是一个HTTP请求,JSON仅在请求包含内容或接受头时才相关。您真的想要像
api/Product/Get/1这样的URI吗?HTTP请求的动词不应该定义动作吗?@Jodrell:他没有说他想要一个名为Get的动作。行动可以是各种各样的东西,例如api/产品/摘要或api/产品/Details@MikeGoodwin,我明白你的意思,但是,这不是休息的堕落吗@乔德雷尔:也许,我的例子不好,但许多好的API中不仅仅包含CRUD操作。这是我的观点。