我研究了如何在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,路由配置是否会更改?
答案 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
所以问题的答案是肯定的,你可以做任何你想做的事情,但不是,这不是全部自动的。