web-dev-qa-db-ja.com

.Net Core WebAPIのSwaggerでベースパスプロパティを設定する方法

aSP.Net Core(バージョン1.1.2)でWeb APIを構築し、Swashbuckle.AspNetCoreを使用してSwagger定義を生成しました。

以下は、自動生成されたSwagger定義の一部です。パスを変更して、/ api/ApiNameが含まれないようにしたいのですが、basePathに含まれるようになり、現在は/になっています。

{
    "swagger": "2.0",
    "info": {
        "version": "v1",
        "title": "ApiName.V1"
    },
    "Host": "ApiUrl",
    "basePath": "/api/ApiName",
    "paths": {
        "/": {
            "get": {
                "tags": [
                    "ApiName"
                ],
                .........

だから私が取得したいのは:

{
    "swagger": "2.0",
    "info": {
        "version": "v1",
        "title": "ApiName.V1"
    },
    "Host": "ApiUrl",
    "basePath": "/",
    "paths": {
        "/api/ApiName": {
            "get": {
                "tags": [
                    "ApiName"
                ],
                .........

.Net Coreで記述されていない他のAPIがいくつかあり、デフォルトルートを追加することで同じ問題を修正しました。 APIコントローラーの上部にあるルートを削除して、.NetCoreで同じことを試みました

[Route("api/[Controller]")]

それをStartup.csに追加します。しかし、これは機能しませんでした。誰かがこれを修正する方法について何か考えがありますか?

9
GeertvdC

結局、私はこれを使ってそれを修正しました:

preSerializeFiltersを設定して、BasePathの追加とパスの編集の両方を行うことができます。もっとエレガントな方法があると思いましたが、これはうまくいきます。

var basepath = "/api/AppStatus";
c.PreSerializeFilters.Add((swaggerDoc, httpReq) => swaggerDoc.BasePath = basepath);


c.PreSerializeFilters.Add((swaggerDoc, httpReq) => {
    IDictionary<string, PathItem> paths = new Dictionary<string, PathItem>();
    foreach (var path in swaggerDoc.Paths)
    {
        paths.Add(path.Key.Replace(basepath, "/"), path.Value);
    }
    swaggerDoc.Paths = paths;
});
11
GeertvdC

IDocumentFilterを使用すると、結果のSwagger定義を変更できます。
ここにいくつかの例があります:

https://github.com/heldersepu/SwashbuckleTest/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs#L285

1