【问题标题】:Added a second controller to my WebAPI and it is not working向我的 WebAPI 添加了第二个控制器,但它不工作
【发布时间】: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/

标签: c# asp.net-mvc asp.net-web-api asp.net-web-api-routing


【解决方案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/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多