向我的 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.csTidalBatchConsolidatedController.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 应用程序添加第二个“屏幕”?

我正在尝试更新数据,但它不起作用

带有 CA 图层掩码的 NSScrollView 添加了第二个无用的滚动条

为什么我的UIImageView取代了第二个?

尝试运行我的应用程序的第二个目标时的 SIGABRT