[WebAPI]為WebAPI增加版本號-使用Swagger套件

最近在工作上遇到要更新API的需求,但又要維持舊版API的向下相容性,

WebAPI的設計與開發的文章中提到了API版本管理

就來使用Swagger來實作API版本管理吧!

安裝Swagger與設定產生程式註解XML

首先要從nuget上安裝Swagger套件

安裝完成後,會在App_Start\有一個SwaggerCofig.cs的檔案,這個檔案是用來設定Swagger的

接著設定專案產出程式註解的XML文件,在專案按右鍵的屬性,選擇建置,在輸出的區塊,勾選
XML文件檔案,我預設是產出到App_Data\的路徑

接下來回到SwaggerConfig.cs檔案,尋找GetXmlCommentsPath()這個Method,把它解開註解然後實作這個method,這個method是用來指定我們剛剛上面所設定的程式註解XML路徑,這樣swagger才有辦法產出畫面與說明

private static string GetXmlCommentsPath()
{
    return AppDomain.CurrentDomain.BaseDirectory + "\\App_Data\\" + "SwaggerVersionExample.xml";
}

到這邊的設定都差不多結束了,基本的Swagger的功能就可以使用了

Swagger的預設路徑會在swagger/ui/index,如果想要一打開站台就連到swagger首頁,可以在Route上設定,記得要擺在Route的第一個設定位置

config.Routes.MapHttpRoute(name: "SwaggerIndex",
    routeTemplate: "",
    defaults: null,
    constraints: null,
    handler: new RedirectHandler((message => message.RequestUri.ToString()), "swagger"));

建立不同版本號的Controller與設定swagger

我在Controller資料夾下建立不同版本號的Controller,要注意的是RoutePrefix要帶入版本號資訊

接下來設定SwaggerConfig.cs中,多版本號的支援

找到c.SingleApiVersion("v1", "SwaggerVersionExample"); 並將它註解起來,同時找到MultipleApiVersions區塊的相關程式碼,解開註解並實作ResolveVersionSupportByRouteConstraintmethod,這個method是用來確認是否有多個版本的Controller

private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion)
{
    return apiDesc.ActionDescriptor.ControllerDescriptor.ControllerType.FullName.Contains(targetApiVersion);
}

接著尋找EnableDiscoveryUrlSelector這個method,並解開註解,這個是可以在swagger的介面上選擇版本

就來執行一下看成果吧

未來在增加新版本api的時候就可以與舊版本同時相容,使用api的開發者只要修改版本對應的route就可以使用不同版本的api了。

最後附上我實作的原始碼
範例程式