Asp.Net WebApiがswaggerにバージョン管理を追加

5959 ワード

Asp.Net WebApiにバージョン管理を追加し、swaggerにバージョン別インタフェースを表示

バージョン管理パッケージの参照




バージョン管理コードの追加


次のようにAppを変更します.StartのWebApiConfigファイル
public static void Register(HttpConfiguration config)
{
    config.Filters.Add(new ApiExceptionFilter());
    config.MessageHandlers.Add(new WrapperHandler());
    // Web API      

    config.AddApiVersioning(o =>
    {
        o.AssumeDefaultVersionWhenUnspecified = true;//       action   1.0  

        o.ReportApiVersions = true;//          
        o.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("api-version"), new QueryStringApiVersionReader("api-version"));//  Header QueryString       api   
        o.DefaultApiVersion = new ApiVersion(1, 0);//      
    });

    var apiExplorer = config.AddVersionedApiExplorer(
            options =>
            {
                options.GroupNameFormat = "'v'VVV";

                // note: this option is only necessary when versioning by url segment. the SubstitutionFormat
                // can also be used to control the format of the API version in route templates
                options.SubstituteApiVersionInUrl = true;
            });

    // Web API   
    config.MapHttpAttributeRoutes();


    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
//    swagger            
    SwaggerConfig.Register(config, apiExplorer);

}

参照swaggerパッケージ




swaggerをマルチバージョンapiに変更


swaggerパッケージを参照すると、自動的にApp_StartはSwaggerConfigファイルを追加し、次のようにコードの一部を変更する必要があります.
//           swagger,        Web.Http.Description.VersionedApiExplorer apiExplorer  
//[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace WebApplication1
{
    public class SwaggerConfig
    {
        public static void Register(HttpConfiguration Configuration, Microsoft.Web.Http.Description.VersionedApiExplorer apiExplorer)
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            Configuration
            .EnableSwagger(c =>
            {
                c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

                c.MultipleApiVersions(
                    (apiDescription, version) => apiDescription.GetGroupName() == version,
                    info =>
                    {
                        foreach (var group in apiExplorer.ApiDescriptions)
                        {
                            //          ,   vs    SwaggerConfig,   SwaggerConfig       ,        SwaggerConfig  ,
                            var description = "A sample application with Swagger, Swashbuckle, and API versioning.";

                            if (group.IsDeprecated)
                            {
                                description += " This API version has been deprecated.";
                            }

                            info.Version(group.Name, $"Create Wordreprot API {group.ApiVersion}");
                        }
                    });


                //      XML          
                var basePath1 = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);//          (  ,      (  )  ,           )
                var xmlComments = Directory.GetFiles(basePath1, "*.xml", SearchOption.AllDirectories).ToList();

                foreach (var xmlComment in xmlComments)
                {
                    c.IncludeXmlComments(xmlComment);
                }
                #region MyRegion

                #endregion
                //   Controller API      
                //c.DocumentFilter();
            })
             .EnableSwaggerUi(
                swagger =>
                {
                    //  api        ,                        ,          
                    swagger.EnableDiscoveryUrlSelector();
                }
             );
        }
    }
}


コントロールでバージョンをマークする


コントロールまたはactionにバージョンタグを追加してバージョンをタグ付けできます.タグのデフォルト1.0がない場合は、デフォルトバージョン設定はコードを参照してください.
public class Controller1 : ApiController
{
    [ApiVersion("1.0")]
    public async Task Get(){
        returt "1.0"
    }
    public async Task Get2(){
        returt "1.0"
    }
}
public class Controller2 : ApiController
{
    [ApiVersion("2.0")]
    public async Task Get(){
        returt "2.0"
    }
}

リクエストの送信


リクエストにバージョン番号タグを付けます.バージョンがない場合はデフォルト1.0です.リクエストは、前述のコードで構成されたapi-versionというqueryパラメータまたはheaderで構成できます.

発生する可能性のある問題

  • swaggerの説明の中の中国語の文字化けして、vsで1つのSwaggerConfigを新しくすることができて、もとのSwaggerConfigの中の内容をコピーして、更に自動的に作成したSwaggerConfigファイル
  • を削除します
  • 起動エラー「This XML file does not appear to have any style information associated with it.The document tree is shown below.」これはswaggerを登録する順番が間違っています.Register(config, apiExplorer);ルーティング登録の後に配置します.
  • apiバージョンを選択するとswagger uiページがリフレッシュされないか、前のバージョンが表示されますか.バージョンを選択するとフォーカスを失って車に戻る必要があります.そうしないと、選択ボックスがポップアップして
  • を選択し続けます.
    参考資料
  • aspnet-api-versioning-SwaggerWebApiSample
  • Swagger UI中国語文字化けし解決