C# ApicController类如何工作和行为?
我研究了如何在MVC项目中使用API,但我对它有一些疑问。(在有人问我之前,我正在用C语言写作) 到目前为止,我知道Api的路由配置是在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}"
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操作。这是我的观点。