2015-02-09 136 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