簡體   English   中英

用於API版本控制的Web API 2屬性路由

[英]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";
    }
}

但是,當我導航到下面顯示的任一路線時,我收到錯誤。

  1. [應用網址] / V1 /狀態
  2. [應用網址] / V2 /狀態

服務器錯誤

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM