ApiController类如何工作和运行?

时间:2013-09-13 14:11:02

标签: 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}"

通过这条路线,我将能够直接为我的ApiController中的特定动作(方法?)构建一个URI。

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

这里的问题是:
如果我有一个名为Products的ApiController类,它是否可以识别为URI的一部分?或者ApiController类必须以“Controller”结尾?
按照教程我把我的ApiController和其他控制器放在同一个文件夹中。我知道可以将Apis放入不同的文件夹中。那么,是MVC自动识别的每一个API吗?我的意思是,无论我保存它们,它们都被认为是API吗?
如果是这样,我最终可以调用位于与我正在处理的项目不同的项目中的API吗?
我可以使用一组API创建单个项目(作为类库)吗?
如果我想在不同的项目中调用API,路由配置是否会更改?

2 个答案:

答案 0 :(得分:6)

哦,这是很多问题......:)

回答这些问题:

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

ASP.NET路由使用了Coonvention,因此,据我所知,如果你按照自己的喜好命名该类,不遵循该约定,它们将无法被识别,你很可能会获得404.所以要回答您的问题,是的,名称必须以Controller结束,除非您覆盖默认约定(请参阅Mike Goodwin答案)。

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

该文件夹无关紧要,ASP.NET将查找与该名称匹配的类。 Api控制器被识别为API控制器,因为它们继承自基础ApiController而不是Controller一个

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

目前尚不清楚......你是什么意思“召唤”一个API?如果API在另一个项目中,它可能会位于一个单独的地址......你只需要将你的JSON请求指向该地址,所以如果你使用jQuery,请执行以下操作:

$.getJSON('http://other.server/api/Controller', function(data) { ... });

而不仅仅是这个:

$.getJSON('/api/Controller', function(data) { ... });

(请注意跨站点脚本问题)。

希望能为你解决问题。随意询问某些东西是否有意义......

答案 1 :(得分:3)

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

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

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

以下是如何进行客户控制器工厂的示例:

http://www.mgolchin.net/posts/18/dive-deep-into-mvc-icontrollerfactory

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