ASP.NET Web Api路由损坏

时间:2015-02-09 21:46:54

标签: c# asp.net routing

我无法在我的asp.net web api项目中使用基本路由。我已经在asp.net(http://www.asp.net/web-api/overview/web-api-routing-and-actions)上关注了一些示例,我在整个stackoverflow中搜索了一下,试图找到一个解决方案。无论我尝试过什么样的例子,我都无法使属性路由工作。

这是我的控制者:

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

这是我的Global.asax.cs:

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

这是我的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 }
        );
    }
}

无论我尝试什么,我最终都是404,或者就上面的代码而言,我收到了消息

  

找不到与请求URI匹配的HTTP资源   'http://localhost:2442/api/employee/1'。

     

在控制器'Employee'上找不到与之匹配的操作   请求。

有或没有整数参数。

2 个答案:

答案 0 :(得分:3)

您是否尝试将RoutePrefix属性放在您的类上:

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

答案 1 :(得分:3)

使用控制器的属性路由,或者不要全部使用它。这意味着您需要使用RoutePrefix来装饰您的控制器,而不是依赖于配置的路由。

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

或在下面的示例中,我们依赖于定义的路由而不是使用属性路由。

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

如果你混搭,那就会让事情变得混乱。