Sid
Sid

Reputation: 117

Two Controllers on the same Web API application

I am trying to add one more controller to our existing Web API. The controllers are like

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

and this is the controller I am trying to add in the same Application

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
   }
}

When I am trying to call the second controller like

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

But it throws the HTTP 404 Page Not Founderror. Do I have to create a different route in the WebConfig.cs. The RouteConfig.cs currently looks like

     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 }
        );
    }
}

Upvotes: 0

Views: 5806

Answers (1)

Vinod
Vinod

Reputation: 1952

You can use attribute routing if you are using web api 2. For more details please visit https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

Here is an example with single controller and multiple actions

[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 into a separate controller

[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));
    }
}

And here is how webapiconfig.cs looks like

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 }
        );
    }
}

Upvotes: 4

Related Questions