WebApi Routing - map url to api - asp.net-mvc

I've been googling for about an hour and not found an example so I thought I'd ask here.
I am replacing a standard mvc controller with a webapi and having problems with the routing, I've changed the names because of the organisation but they are still valid.
my webapi is currently called SystemAPI in the controllers folder - I want it to have a different name that the url that points to it ideally.
The url I need to point to it is /v1Controller/{id}
I cant change the v1Controller url as it is a fixed point with apps I have no control over
my current coding attempt is
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DocumobiApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "V1Controller",
routeTemplate: "v1Controller/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
// To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
// For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
//config.EnableQuerySupport();
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
}
to which I get the response
"message":"No HTTP resource was found that matches the request URI 'http://localhost:38685/v1Controller'.","messageDetail":"No route providing a controller name was found to match request URI 'http://localhost:38685/v1Controller'"}
I'm sure its something fairly obvious but cant for the life of me figure it out.
Cheers,
Steven

As the following error message says, a route match should result in providing value for the controller route variable which Web API depends on for selecting a controller.
No route providing a controller name was found to match request URI 'http://localhost:38685/v1Controller
So you could modify the route like below(notice the default value for controller variable):
config.Routes.MapHttpRoute(
name: "V1Controller",
routeTemplate: "v1Controller/{id}",
defaults: new { id = RouteParameter.Optional, controller="SomeControllerHere" }
);

Make sure your action method on your controller has an id with a default value.

Related

Web API controller in subfolder not being found with attribute routing

I have a controller in this folder structure:
Site
-Controllers
--API
---EventsController.cs
The EventsController.cs contains this:
[RoutePrefix("api")]
public class EventsController : Controller
{
[Route("event")]
public ActionResult Index()
{
return View("~/Views/Home/Index.cshtml");
}
The WebApiConfig.cs contains this:
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 }
);
}
When I run the site from Visual Studio and try to access http://127.0.0.1:8080/api/event I see nothing but this error:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://127.0.0.1:8080/api/event'.
</Message>
<MessageDetail>
No type was found that matches the controller named 'event'.
</MessageDetail>
</Error>
If I comment out the config.Routes.MapHttpRoute line to make WebApiConfig.cs as the following, the URL above works:
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 }
//);
}
What am I doing wrong? What is it that causes the attribute routing to fail when the DefaultApi route is configured? I have tried placing it before/after the config.MapHttpAttributeRoutes(); and neither works.
As an aside, I have manually built up this project while reading the following article, which has the same structure of MVC/Web API project and which does work. I just can't figure out what I've done differently.
http://www.codemag.com/Article/1605081
Thanks to #phil-cooper the answer was to inherit the correct base class in the api controller.

Route Conflicts in web api for Get with multiple parameters

I'm using Web Api to create REST APIs that have parameters ranging from 0 to 4.
Below are examples of my APIs :
GetTaxRates()
GetTaxRatesByDate(string date, string name= "") // name is an optional parameter
GetTaxBetweenDates(string frmDate, string toDate, string name="") // name is an optional parameter
GetRecentTaxRates(string name= "") // name is an optional parameter
For these different GET calls,
i have created the following routes in the webapiconfig :
routeTemplate: "api/{controller}/{action}",
defaults: new { }
routeTemplate: "api/{controller}/{action}/{date}/{name}",
defaults: new { name= RouteParameter.Optional }
routeTemplate: "api/{controller}/{action}/{frmdate}/{toDate}/{name}",
defaults: new { name= RouteParameter.Optional }
When i am calling the APIs, it works fine for most of the routes, but there seems to be a conflict between the routes and i get the error "No action was found on the controller 'TaxRate' that matches the request." when i call the action api/TaxRate/GetTaxBetweenDates/2015-04-01/201504-10
Although i am getting the results when calling the same api with all the parameters: api/TaxRate/GetTaxBetweenDates/2015-04-01/201504-10/abc
When i change the sequence of the routes, the same issue occurs GetTaxRatesbyDate API call.
As per rule of thumb in web api routing you should register the more specific routes first. Have a look at this link Routing order. What might help here is registering more specific routes like "api/{controller}/GetTaxRatesByDate/{date}/{name}", defaults: new { name= RouteParameter.Optional }
I was able to resolve the above issue using attribute routing.

"ExceptionMessage": "Multiple actions were found that match the request:

Hi found many helpful link to solve this but nothing is working to me :(. Can any one look at this as where I am going wrong?
Controller :
[ActionName("savebook")]
[HttpPost]
public HttpResponseMessage PostSaveBook([FromBody]Book product)
{
return Add(product);
}
[ActionName("savemobile")]
[HttpPost]
public HttpResponseMessage PostSaveMobile([FromBody]Mobile product)
{
return Add(product);
}
WebApiRouteConfig.
config.Routes.MapHttpRoute(
name: "ControllerOnly",
routeTemplate: "api/{controller}"
);
// Controller with ID
// To handle routes like `/api/VTRouting/1`
config.Routes.MapHttpRoute(
name: "ControllerAndId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = #"^\d+$" } // Only integers
);
// Controllers with Actions
// To handle routes like `/api/VTRouting/route`
config.Routes.MapHttpRoute(
name: "ControllerAndAction",
routeTemplate: "api/{controller}/{action}"
);
Error :
**
"ExceptionMessage": "Multiple actions were found that match the
request:
**
The first route that you have registered is the RESTful style route, which doesn't include an {action} segment.
As the routes are evaluated in the same order that they are registered, whenever you send a POST request, the controller name will be taken from the URL, and then, the action selector will look for an action whose name starts with Post. In your case there are two actions that fulfill this condition: PostSaveBook and PostSaveMobile.
If the first registered route was the "ControllerAndAction" one, the action would be taken from the URL and the action selector could correctly choose the desired action.
If you want to use the RESTful style, you'd have to use attribute routing to break the ambiguity.

Non Api routing with SPA and Web Api

I have been trying for a few days to solve this problem so I may in fact be trying to solve the wrong problem or don't know the right terms to search so here goes.
I'm creating a SPA with AngularJS and Web Api (4.5). All of my views are client side. So the server doesn't know all the possible routes that may become present in the URI. This isn't a problem until a user uses one of the browser controls (back, forward, refresh, history) and the server attempts to route the requested URI.
My thoughts on dealing with this have centered around mapping all non API routes to the root of the application.
So I would like to either, know the correct syntax for MapHttpRoute to pick up any route that does not attempt to reference controllers (API's) or if there is a better method for dealing with this problem.
public static void Register( HttpConfiguration config )
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//
// This doesn't work
//
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{*catchall}"
);
}
This XML file does not appear to have any style information associated with it. The document tree is shown below.
No HTTP resource was found that matches the request URI 'http://localhost:9234/login'.
No route providing a controller name was found to match request URI 'http://localhost:9234/login'
Not a good idea, just workaround
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{*catchall}",
defaults: new { controller = "Spa"}
);
[AllowAnonymous]
public sealed class SpaController : ApiController
{
public HttpResponseMessage Get()
{
var indexHtml = HostingEnvironment.MapPath("~/index.html");
var stringContent = new StreamContent(File.OpenRead(indexHtml));
var response = new HttpResponseMessage(HttpStatusCode.OK) {Content = stringContent};
return response;
}
}

No HTTP resource was found that matches the request URI

I just deployed my MVC app to a subdomain and I just can't get webapi to work.
Accessing locally:
localhost:40052/api/apiEmpreendimento/GetObjects
works just fine, but accessing the following online:
http://subdomain.mysite.com/api/apiEmpreendimento/GetObjects
Gives me
{"Message":"No HTTP resource was found that matches the request URI 'http://subdomain.mysite.com/api/apiEmpreendimento/GetObjects'."}
App_Start/WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "get", id = RouteParameter.Optional }
);
}
}
Any tip is much appreciated.
Thanks
I thought it's about new WepApi. MVC understands it like WebApi controller, Microsoft Reserved Api Controlller for their selves, I changed my Controller name With MyApiController and problem solved.

Resources