【问题标题】:Two Controllers on the same Web API application同一个 Web API 应用程序上的两个控制器
【发布时间】:2016-11-22 18:01:48
【问题描述】:

我正在尝试向我们现有的 Web API 添加一个控制器。控制器就像

public class TDataController : ApiController
{        
   [HttpGet]
   public HttpResponseMessage Getdetails(string ROOM, DateTime DOB_GT, DateTime DOB_LT, string STATUS_TYPE)
   { 
     // Code for the controller
   }
}

这是我试图在同一个应用程序中添加的控制器

public class TDataSubDateController : ApiController
{
   [HttpGet]
   public HttpResponseMessage Getdetails(string ROOM, string STATUS_TYPE, DateTime? SUBDATE_GT = null, DateTime? SUBDATE_LT = null)
   {
     //Code for the controller
   }
}

当我试图调用第二个控制器时

http://localhost:33823/api/TDataSubDate?ROOM=xxx&STATUS_TYPE=xxx&SUBDATE_GT=xxxx&SUBDATE_LT=xxxx

但它会抛出HTTP 404 Page Not Founderror。我是否必须在 WebConfig.cs 中创建不同的路由。 RouteConfig.cs 目前看起来像

     public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

【问题讨论】:

  • 该路由配置是用于 MVC,而不是用于 Web API。
  • 如何在同一个 API 中处理两个控制器。为了测试,我使用了相同的代码并创建了单独的 Web API,它运行良好并返回结果
  • 您需要找到您的 Web API 路由的配置位置。如果您使用默认模板,可能是WebApiConfig.cs。路由全部解释here
  • 我已经用 WebConfig.cs 编辑了我的问题。我在这里创建了一条新路线吗?

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


【解决方案1】:

如果你使用的是web api 2,你可以使用属性路由。更多详情请访问https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

这是一个具有单个控制器和多个操作的示例

[RoutePrefix("api/tdata")]
public class TDataController : ApiController
{        
    [HttpGet]
    [Route("{ROOM}/preview")]
    public IHttpActionResult Getdetails(string ROOM, [FromUri]DateTime DOB_GT, [FromUri]DateTime DOB_LT, [FromUri]string STATUS_TYPE)
    { 
        return Ok(string.Format("Room {0} Preview", ROOM));
    }

    [HttpGet]
    [Route("{ROOM}/details")]
    public IHttpActionResult Getdetails(string ROOM, [FromUri]string STATUS_TYPE, [FromUri]DateTime? SUBDATE_GT = null, [FromUri]DateTime? SUBDATE_LT = null)
    {
        return Ok(string.Format("Room {0} Details", ROOM));
    }
}

OR 到一个单独的控制器中

[RoutePrefix("api/tdatasubdate")]
public class TDataSubDateController : ApiController
{
    [HttpGet]
    public IHttpActionResult Getdetails([FromUri]string ROOM, [FromUri]string STATUS_TYPE, [FromUri]DateTime? SUBDATE_GT = null, [FromUri]DateTime? SUBDATE_LT = null)
    {
        return Ok(string.Format("Room {0} Details", ROOM));
    }
}

这是 webapiconfig.cs 的样子

public static class WebApiConfig
{
    /// <summary>
    /// configure global routes
    /// </summary>
    /// <param name="config"></param>
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

【讨论】:

  • 我们不需要更改 WebConfig.cs 中的任何内容吗?我尝试添加 [Route("api/tdatasubdate")] 并尝试将 API 调用为http://localhost:33823/api/tdatasubdate?ROOM=xxx&amp;STATUS_TYPE=xxx&amp;SUBDATE_GT=xxxx&amp;SUBDATE_LT=xxxx 它仍然无法正常工作
  • 您的应用程序启动过程中是否有以下声明? GlobalConfiguration.Configure(WebApiConfig.Register);通常它位于 global.asax.cs
  • 是的,我在 Global.asax.cs 中有声明。我可以浏览另一个控制器 TData。这只是 TDataSubDate 控制器的问题
  • 有效的控制器的网址是什么?你能在另一个测试项目中重现错误吗?
猜你喜欢
  • 2019-04-18
  • 2019-10-16
  • 2015-11-07
  • 2015-01-21
  • 2017-03-12
  • 2017-03-01
  • 2019-08-03
  • 2011-07-10
  • 1970-01-01
相关资源
最近更新 更多