向我的 WebAPI 添加了第二个控制器,但它不工作
Added a second controller to my WebAPI and it is not working
在我的 WebAPI 项目中添加了第二个控制器,它也没有完全工作,但第一个控制器按预期工作
默认 URI 适用于第一个控制器 return 所有记录:
http://localhost:59654/api/TidalBatch
第二个控制器不工作,return出现了有问题的错误:
http://localhost:59654/api/TidalBatchConsolidated
但是,如果我为它传入 {id},当我使用该 id 时它确实有效(示例所示):
http://localhost:59654/api/TidalBatchConsolidated/BAM
尝试修改路由地址
WebAPI 配置:
config.MapHttpAttributeRoutes();
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 }
);
我有 2 个控制器,TidalBatchController.cs
和 TidalBatchConsolidatedController.cs
。两者都继承自 ApiController
class.
这是我的第二个控制器未按预期工作的示例:
public class TidalBatchConsolidatedController : ApiController
{
public TidalBatchConsolidated GetAll(string id)
{
using (BDW_ProcessingEntities_TidalBatch entities = new BDW_ProcessingEntities_TidalBatch())
{
return entities.TidalBatchConsolidateds.FirstOrDefault(e => e.CompanyAbbr == id);
}
}
}
当我导航到地址中的基本控制器时,它应该 return List 结果为 JSON 格式,该格式基于传入的实体数据模型。
首先,注册路由的顺序很重要,因为在更具体的路由之后需要注册更通用的路由。其次,您更具体的路线需要控制器才能匹配。
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) {
//...
}
}
在我的 WebAPI 项目中添加了第二个控制器,它也没有完全工作,但第一个控制器按预期工作
默认 URI 适用于第一个控制器 return 所有记录: http://localhost:59654/api/TidalBatch
第二个控制器不工作,return出现了有问题的错误: http://localhost:59654/api/TidalBatchConsolidated
但是,如果我为它传入 {id},当我使用该 id 时它确实有效(示例所示): http://localhost:59654/api/TidalBatchConsolidated/BAM
尝试修改路由地址
WebAPI 配置: config.MapHttpAttributeRoutes();
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 }
);
我有 2 个控制器,TidalBatchController.cs
和 TidalBatchConsolidatedController.cs
。两者都继承自 ApiController
class.
这是我的第二个控制器未按预期工作的示例:
public class TidalBatchConsolidatedController : ApiController
{
public TidalBatchConsolidated GetAll(string id)
{
using (BDW_ProcessingEntities_TidalBatch entities = new BDW_ProcessingEntities_TidalBatch())
{
return entities.TidalBatchConsolidateds.FirstOrDefault(e => e.CompanyAbbr == id);
}
}
}
当我导航到地址中的基本控制器时,它应该 return List 结果为 JSON 格式,该格式基于传入的实体数据模型。
首先,注册路由的顺序很重要,因为在更具体的路由之后需要注册更通用的路由。其次,您更具体的路线需要控制器才能匹配。
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) {
//...
}
}