2015-02-09 117 views
1

我无法获得基本路由以在我的asp.net web api项目中工作。我已经遵循asp.net(http://www.asp.net/web-api/overview/web-api-routing-and-actions)上的示例,并且我已经在整个stackoverflow中搜索,试图找到解决方案。无论我尝试过哪些示例,我都无法使属性路由起作用。ASP.NET Web Api路由损坏

这是我的控制器:

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://localhost:2442/api/employee/1'匹配的HTTP资源。

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

带或不带整数参数。

回答

2

或者使用属性的路由控制器,或不使用它。这意味着您需要使用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(); 
    } 
} 

如果你混搭,它会混淆事物。

+0

感谢您对此进行清理。我觉得方法上的路由属性优先于默认路由映射 – 2015-02-09 22:00:52

+0

@ transporter_room_3我相信它优先的原因是因为在映射其他路由之前有'config.MapHttpAttributeRoutes();'。然而,你得到错误的原因是没有路由前缀,因此你需要请求的URL是'〜/ 1',因为根据我的经验,你不能混合和匹配属性路由与正常路由同一个控制器。如果你没有指定RoutePrefix,我不相信它会使用映射到后面路由的控制器,这就是为什么〜/ api/employee/1给你一个错误。 – mason 2015-02-09 22:13:50

3

你尝试把RoutePrefix属性上你的类是这样的:

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

这就是诀窍,哇。但我的印象是(从阅读asp.net上的tuts),你不必使用路由前缀属性?例如,我可以用[Route(“api/employee/name”)]来指定一个方法。但这似乎并不奏效。 – 2015-02-09 21:54:59