[英]Web API 2 Attribute Routing for API Versioning
我有一個ASP.NET Web API 2應用程序,它使用基於約定的路由:
[app-url]/v1/[controller]
現在,我想在API中添加另一個版本,並發現屬性路由是實現我想要的最簡單方法。 因此,我在Application_Start()
方法中注冊了Web API路由,如下所示。
GlobalConfiguration.Configure(WebApiConfig.Register);
另外,我確保WebApiConfig
類中的Register()
方法僅包含以下行:
config.MapHttpAttributeRoutes();
有兩個控制器來測試版本控制:
/v1/StatusController.cs
[RoutePrefix("v1/status")]
public class StatusController : ApiController
{
[Route("")]
public string Get()
{
return "V1 - OK";
}
}
/v2/StatusController.cs
[RoutePrefix("v2/status")]
public class StatusController : ApiController
{
[Route("")]
public string Get()
{
return "V2 - OK";
}
}
但是,當我導航到下面顯示的任一路線時,我收到錯誤。
服務器錯誤
404 - 找不到文件或目錄。
您要查找的資源可能已被刪除,名稱已更改或暫時不可用。
您的方法將無法工作,因為ASP.NET Web API使用所謂的Controller Selector
來查找給定路由的相應控制器。 但是,此選擇器不考慮控制器的名稱空間,而是使用其名稱。
默認情況下,Web API附帶DefaultHttpControllerSelector ,您可以在此處找到有關其實現的信息 。
您的問題的一個可能的解決方案是實現自定義IHttpControllerSelector
並告訴Web API使用它。 為此,您可以在互聯網上找到幾個例子。
相反,您也可以將控制器名稱更改為唯一,例如:
StatusV1Controller
StatusV2Controller
不使用不同的命名空間,而是使用不同的控制器名稱(如果這適用於您)。 如果是這樣,這里是關於代碼應該如何:
/v1/StatusController.cs:
[System.Web.Http.RoutePrefix("v1/status")]
public class StatusController : ApiController
{
[System.Web.Http.Route("")]
public string Get()
{
return "V1 - OK";
}
}
/v2/StatusController.cs:
[System.Web.Http.RoutePrefix("v2/status")]
public class Status2Controller : ApiController
{
[System.Web.Http.Route("")]
public string Get()
{
return "V2 - OK";
}
}
現在,您可以通過調用Http Get方法調用這兩個不同的版本,如:
Https://YourUrl.com/v1/status
和:
Https://YourUrl.com/v2/status
希望這建議替代幫助。 祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.