I'm having some troubles configuring WebApi routes in an asp.net WebForms app.
In the global.asax
file, I have something like this:
void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
I have another file that has this code:
using System.Web.Http;
namespace WebConfig
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { id = System.Web.Http.RouteParameter.Optional });
}
}
}
Then, in the root, I have a folder called api and in that folder I have a file that contains a class that looks somewhat like that:
public class MyController : ApiController
{
[Route("MyController")]
[HttpPost]
public HttpResponseMessage Post([FromBody]string value)
{....}
And then finally, in my client code, I have this ajax call:
$.ajax({
url: "/api/MyController",
contentType: "application/json; charset=utf-8",
type: "POST",
dataType: "json",
cache: "false",
data: someData});
However, when I run this code, all I get is a 404 error. What do I need to change in the routing mechanism to make this work?
I think others were very close. Try this:
[RoutePrefix("api")] // or maybe "api/", can't recall OTTOMH...
public class MyController : ApiController
{
[Route("MyController")]
[HttpPost]
public HttpResponseMessage Post([FromBody]string value)
and then request /api/MyController
If this doesn't work, use RouteDebugger to analyze your routes, and why it rejects a match. Amend your question with what you see in RouteDebugger so I can trace down what is not matching.
Also, you may need to call MapHttpAttributeRoutes
in your Register
function - but not sure about that.
Edit
Now that I'm looking at it again, I think I see more issues with it.
First, let's start with the template:
Here is what you have (from your question):
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { id = System.Web.Http.RouteParameter.Optional });
The odd part here is that your template does not have {id}
segment, but is defined as optional. Sounds like it is missing from the template, and the route should be changed to:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional });
Note that you also removed default action - I'm not sure if MVC automatically uses convention method of locating a method called Post
, but I suppose it does.
Second problem is that your method signature is (again from your question):
public HttpResponseMessage Post([FromBody]string value)
It defines Post
that takes in a parameter named value
, whereas your route defines parameter named id
. Hence there is another mismatch. You can rename the variable or decorate (see below). Also, {id}
is marked optional, but I believe (and here I don't remember exactly OTTOMH) you need to give default value to to value for those cases where {id}
is not supplied, and so combining together:
public HttpResponseMessage Post([FromBody(Name="id")]string value = null)
This should fix it, although there may be more issues... but let's start with these.
Change url: "/api/MyController"
to url: "/api/My"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With