在我的WebAPI项目中添加了第二个控制器,它也不能完全正常工作,但是第一个控制器正在按预期工作
默认URI适用于第一个控制器返回所有记录: http://localhost:59654/api/TidalBatch
第二个控制器不起作用,并返回相关错误: http://localhost:59654/api/TidalBatchConsolidated
但是,如果我传入{id},那么它在我使用id时确实起作用(显示示例): http://localhost:59654/api/TidalBatchConsolidated/BAM
试图修改路由地址
WebAPI配置: config.MapHttpAttributeRoutes();
@media screen and (max-width: 780px){
.intro .intro-title {
color: #fff;
font-weight: 600;
font-size: 2rem;
}
}
我有2个控制器, config.Routes.MapHttpRoute(
name: "TidalBatchApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "TidalBatchConsolidatedApi",
routeTemplate: "api/TidalBatchConsolidated/{id}",
defaults: new { id = RouteParameter.Optional }
);
和TidalBatchController.cs
。两者都继承自TidalBatchConsolidatedController.cs
类。
这是我的第二个控制器未按预期工作的示例:
ApiController
当我导航到该地址中的基本控制器时,它应根据传入的实体数据模型以JSON格式返回List结果。
答案 0 :(得分:0)
首先,注册路由的顺序很重要,因为在更特定的路由之后需要注册更多通用路由。其次,您需要更具体的路由来匹配控制器。
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "TidalBatchConsolidatedApi",
routeTemplate: "api/TidalBatchConsolidated/{id}",
defaults: new { controller ="TidalBatchConsolidated", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "TidalBatchApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
控制器还需要确保有匹配的动作
例如
public class TidalBatchConsolidatedController: ApiController {
[HttpGet]
public IHttpActionResult Get() {
//...
}
[HttpGet]
public IHttpActionResult Get(string id) {
//...
}
}
由于您已启用config.MapHttpAttributeRoutes();
的属性路由,因此可以放弃基于约定的路由,而在控制器上使用属性路由
[RoutePrefix("api/TidalBatchConsolidated")]
public class TidalBatchConsolidatedController: ApiController {
//GET api/TidalBatchConsolidated
[Route("")] //Default route
[HttpGet]
public IHttpActionResult GetAll() {
//...
}
//GET api/TidalBatchConsolidated/BAM
[Route("{id}")]
[HttpGet]
public IHttpActionResult Get(string id) {
//...
}
}