向我的 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.csTidalBatchConsolidatedController.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) {
        //...
    }

}

引用Attribute Routing in ASP.NET Web API 2