向我的 WebAPI 添加了第二个控制器,但它不工作
Posted
技术标签:
【中文标题】向我的 WebAPI 添加了第二个控制器,但它不工作【英文标题】:Added a second controller to my WebAPI and it is not working 【发布时间】:2019-11-16 07:53:42 【问题描述】:在我的 WebAPI 项目中添加了第二个控制器,它也没有完全工作,但第一个控制器按预期工作
默认 URI 适用于第一个控制器返回所有记录: http://localhost:59654/api/TidalBatch
第二个控制器不工作并返回有问题的错误: 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
类。
这是我的第二个控制器未按预期工作的示例:
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);
当我导航到地址中的基本控制器时,它应该根据传入的实体数据模型以 JSON 格式返回列表结果。
【问题讨论】:
这是我的第二个控制器的示例,它没有按预期工作: public class TidalBatchConsolidatedController : ApiController public TidalBatchConsolidated GetAll(string id) using (BDW_ProcessingEntities_TidalBatch entity = new BDW_ProcessingEntities_TidalBatch()) return entity。 TidalBatchConsolidateds.FirstOrDefault(e => e.CompanyAbbr == id); 请将您的控制代码粘贴到您的问题中 尝试在这样的网址后添加/
http://localhost:59654/api/TidalBatchConsolidated/
【参考方案1】:
首先,注册路由的顺序很重要,因为在更具体的路由之后需要注册更通用的路由。其次,您更具体的路线需要控制器才能匹配。
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)
//...
参考Attribute Routing in ASP.NET Web API 2
【讨论】:
这应该可以在没有第一条路线的情况下工作。可以删除您答案中的特定路线。更通用的路由与指定路由相同。 @mrspringer 是的,我知道,但想向 OP 展示有关指定默认值的信息。 谢谢。我按照上述进行了编辑,但我仍然得到 No HTTP resource was found that match the request URI 'localhost:59654/api/TidalBatchConsolidated' 错误。 @TimothyRodriguez 如果没有提供 id 应该怎么办? 返回表集的所有记录。例如:如果我调用 api/TidalBatch/ 的 URI,那么它的所有记录都会被填充,类似于 GET ALL。出于某种原因,除非我将 id 传递给它,否则 TidalBatchConsolidated 不会做同样的事情: api/TidalBatchConsolidated/以上是关于向我的 WebAPI 添加了第二个控制器,但它不工作的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何向我的 kivy 应用程序添加第二个“屏幕”?