1. ホーム
  2. c#

[解決済み] Swagger not loading - Failed to load API definition: フェッチエラーは未定義です

2022-02-27 09:44:18

質問

IIS expressでホストされているWebアプリケーションと連動してswaggerをセットアップしようとしています。APIはASP Net Coreを使用して構築されています。私はSwashbuckleとASP.NET Coreに関する関連するマイクロソフトのヘルプページで規定されている指示に従いました。

今のところ、swaggerページを読み込むことができ、私が定義したSwaggerDocが読み込まれていることが確認できますが、APIは存在しません。現在、以下のエラーが発生しています。

Fetch error undefined ./swagger/v1/swagger.json"。

public class Startup
{

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // services.AddDbContext<TodoContext>(opt =>
        // opt.UseInMemoryDatabase("TodoList"));
        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Register the Swagger generator, defining 1 or more Swagger documents
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("./swagger/v1/swagger.json", "My API V1");
            c.RoutePrefix = string.Empty;
        });

        app.UseMvc();
    }
}

解決方法は?

で、いろいろトラブルシューティングした結果、基本的には2つのことに行き着いたのですが、一般的には今後の誰かの参考になるような気がするので、回答を投稿させていただきます。

まず、前述のエラーで立ち往生した場合、何が起こっているかを実際に確認する最良の方法は、Configure()メソッドに次の行を追加することです。

app.UseDeveloperExceptionPage();

ここで、「swagger/v1/swagger.json」ページに移動すると、有用な方向を示すいくつかの詳細な情報が表示されます。

次に、私の場合、エラーは次のようなものでした。

'パス 'some_path'とメソッド 'GET' で複数の操作 '

しかし、これらのAPIは依存ライブラリの中にあるため、定義の時点で解決策を適用することができませんでした。回避策として、ConfigureServices()メソッドに以下の行を追加することで問題が解決することがわかりました。

services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v1", new Info { Title = "API WSVAP (WebSmartView)", Version = "v1" });
     c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); //This line
});

最後に- JSONファイルを生成することができましたが、まだUIを引き出すことができませんでした。これを動作させるために、Configure()のエンドポイントを変更する必要がありました。

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("./v1/swagger.json", "My API V1"); //originally "./swagger/v1/swagger.json"
});

なぜこれが必要なのかはわかりませんが、Webアプリケーションの仮想ディレクトリがIISでホストされていることが影響しているのかもしれませんね。

注:swagger/v1/swagger.jsonに移動すると詳細がわかりますが、私にとっては装飾されていないアクションが原因で問題が発生しました。この情報は、@MarkDのコメントで言及されています。

今後、どなたかのお役に立てれば幸いです。