简体   繁体   中英

ASP.NET Web Api Routing Broken

I am unable to get basic routing to work in my asp.net web api project. I have followed examples on asp.net ( http://www.asp.net/web-api/overview/web-api-routing-and-actions ) and I have searched throughout stackoverflow in an attempt to find a solution. Whatever examples I have tried, I cannot get attribute routing to work.

This is my controller:

public class EmployeeController : ApiController
{
    private readonly IRepository<Employee> _employees; 

    public EmployeeController(IRepository<Employee> repo)
    {
        _employees = repo;
    }


    [Route("")]
    public IEnumerable<Employee> GetEmployees()
    {
        return _employees.Queryable();
    }


    [Route("{id:int}")]
    public Employee GetEmployee(int id)
    {
        return _employees.Queryable().FirstOrDefault();
    }
}

This is my Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

This is my 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 }
        );
    }
}

No matter what I attempt, I end up either with a 404 or as in the case of the code above, I get the message

No HTTP resource was found that matches the request URI ' http://localhost:2442/api/employee/1 '.

No action was found on the controller 'Employee' that matches the request.

with or without the integer parameter.

Did you try putting the RoutePrefix attribute on your class like this:

[RoutePrefix("api/employee")]
public class EmployeeController : ApiController

Either use the attribute routing for your controller, or don't use it all. That means you need to decorate your controller with RoutePrefix instead of relying on the configured routes.

[RoutePrefix("api/employee")
public class EmployeeController : ApiController
{
    private readonly IRepository<Employee> _employees; 
    public EmployeeController(IRepository<Employee> repo)
    {
        _employees = repo;
    }
    [Route("")]
    public IEnumerable<Employee> GetEmployees()
    {
        return _employees.Queryable();
    }
    [Route("{id}")]
    public Employee GetEmployee(int id)
    {
        return _employees.Queryable().FirstOrDefault();
    }
}

or in the below example, we rely on the defined route instead of using attribute routing.

public class EmployeeController : ApiController
{
    private readonly IRepository<Employee> _employees; 
    public EmployeeController(IRepository<Employee> repo)
    {
        _employees = repo;
    }
    public IEnumerable<Employee> GetEmployees()
    {
        return _employees.Queryable();
    }
    public Employee GetEmployee(int id)
    {
        return _employees.Queryable().FirstOrDefault();
    }
}

If you mix and match, it confuses things.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM