iamanoob
iamanoob

Reputation: 208

ASP.Net Web API 404 Error on 2nd API

So I already have 1 Web API set up and working great, but now that I am trying to set up my own admin panel ( which I did ), I need to use the DeleteUser() function from the Web API named AdminApi but I can't seem to get it working. I keep getting 404 error while giving the path that the API should be at.

Web Api Config:

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}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Global :

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    //Create the custom role and user
    RoleActions roleActions = new RoleActions();
    roleActions.AddUserAndRole();
}

AdminApi :

[Authorize(Roles = "admin")]
public class AdminApiController : ApiController
{
    public string test()
    {
        return "test";
    }

    [HttpPost]
    public string DeleteUser(string id)
    {
        ApplicationDbContext db = new ApplicationDbContext();
        var user = db.Users.Find(id);
        if (user != null)
        {
            string email = user.Email;
            db.Users.Remove(user);
            return "Succesfully deleted user : " + email;
        }
        else
            return "Failed to delete user.";
    }
}

Ajax :

function deleteUser (id)
{
    $.ajax({
        url: '../api/AdminApi/DeleteUser',
        type: 'POST',
        contentType: "application/json",
        dataType: 'json',
        data: JSON.stringify(id),
        success: function (data) {
            alert(data);
        },
        error: function (x, y, z) {
            alert(x + '\n' + y + '\n' + z);
        }
    });
}

The ajax function is called on the page /Admin/AdminPage so to get to the web api -> ../api/AdminApi and the function to delete users is DeleteUser -> ../api/AdminApi/DeleterUser

I don't get why I get a 404 error. I can understand if my function DeleteUser is not working since I haven't tested it, but I can't test it if I can't get in the function.

Upvotes: 3

Views: 481

Answers (1)

Dalorzo
Dalorzo

Reputation: 20014

The issue is related to how you use the attribute:

[Route("DeleteUser")]

If you use the Attribute Route. at Method level what it does is to define new route or more routes therefore the way you should use it is like [Route('Url/path1/route1')]:

As an example of how it works:

//GET api/customer/GetMetaData
[Route('/api/customer/GetMetaData')]
public string Get2(){
      //your code goes here
}

If you will be declaring several Routes in your class then you can use RoutePrefix attribute like [RoutePrefix('url')] at class level. This will set a new base URL for all methods your in Controller class.

For example:

[RoutePrefix("api2/some")]
public class SomeController : ApiController
{
    // GET api2/some
    [Route("")]
    public IEnumerable<Some> Get() { ... }

    // POST api2/some/DeleteUser/5 
    [HttpPost]
    [Route("DeleteUser/{id:int}")]
    public Some DeleteUser(int id) { ... } 

}

Update

By default Web API looks at the routing URL first, what is in your [Route] I mean and it tries to match it against your post. However if your method has a complex object as parameter WebApi can't get the values from the request URI because the parameter is a complex type Web API uses a media-type formatter to read the value from the request body.

Since your string id is not a complex object and it is part of your Route WebApi expects it as part of your URL not the body. Try this instead:

[HttpPost]
public string DeleteUser([FromBody]string anotherName)

Upvotes: 1

Related Questions