C# 同一Web API应用程序上的两个控制器

C# 同一Web API应用程序上的两个控制器,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我正在尝试向现有的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 } }

我正在尝试向现有的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
   }
}
当我试图调用第二个控制器时

但是它抛出
http404页面未找到
错误。我是否必须在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 }
        );
    }
}
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 }
        );
    }
}

如果您使用的是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));
    }
}
或放入一个单独的控制器中

[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
{
    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 }
        );
    }
}
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 }
        );
    }
}
公共静态类WebApiConfig
{
/// 
///配置全局路由
/// 
/// 
公共静态无效寄存器(HttpConfiguration配置)
{
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
}

如果您使用的是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));
    }
}
或放入一个单独的控制器中

[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
{
    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 }
        );
    }
}
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 }
        );
    }
}
公共静态类WebApiConfig
{
/// 
///配置全局路由
/// 
/// 
公共静态无效寄存器(HttpConfiguration配置)
{
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
}
}

路由配置是针对MVC的,而不是针对Web API的。如何处理同一API中的两个控制器。为了进行测试,我使用了相同的代码并创建了单独的Web API,它工作得非常好,并返回结果。您需要找到Web API路由的配置位置。如果使用默认模板,则可能
WebApiConfig.cs
。我已经用WebConfig.cs编辑了我的问题。我必须在这里创建新路由吗?尝试使用路由属性:该路由配置是针对MVC的,而不是针对Web API的。我如何处理同一API中的两个控制器。为了进行测试,我使用了相同的代码并创建了单独的Web API,它工作得非常好,并返回结果。您需要找到Web API路由的配置位置。如果使用默认模板,则可能
WebApiConfig.cs
。我已经用WebConfig.cs编辑了我的问题。我必须在这里创建新路由吗?尝试使用路由属性:我们不需要在WebConfig.cs中更改任何内容吗?我尝试添加[Route(“api/tdatasubdate”)],并尝试以
http://localhost:33823/api/tdatasubdate?ROOM=xxx&STATUS_TYPE=xxx&SUBDATE_GT=xxxx&SUBDATE_LT=xxxx
它仍然不工作。在应用程序启动时,您是否有以下语句?GlobalConfiguration.Configure(WebApiConfig.Register);通常它放在global.asax.cs中是的,我在global.asax.cs中有声明。我可以浏览其他控制器的TData。这只是TDataSubDate控制器的问题控制器的url是什么?你能在另一个测试项目中重现错误吗?我们不需要在WebConfig.cs中更改任何内容吗?我尝试添加[Route(“api/tdatasubdate”)],并尝试以
http://localhost:33823/api/tdatasubdate?ROOM=xxx&STATUS_TYPE=xxx&SUBDATE_GT=xxxx&SUBDATE_LT=xxxx
它仍然不工作。在应用程序启动时,您是否有以下语句?GlobalConfiguration.Configure(WebApiConfig.Register);通常它放在global.asax.cs中是的,我在global.asax.cs中有声明。我可以浏览其他控制器的TData。这只是TDataSubDate控制器的问题控制器的url是什么?你能在另一个测试项目中重现错误吗?