web-dev-qa-db-ja.com

ASP.NET Core-Swashbuckleがswagger.jsonファイルを作成しない

Swashbuckle.AspNetCore(1.0.0)パッケージを取得して出力を生成するのに問題があります。 swagger.jsonファイルを「〜/ swagger/docs/v1」に書き込む必要があることを読みました。ただし、出力が得られません。

私は新しいASP.NET Core APIプロジェクトから始めました。これはASP.NET Core 2であることに言及する必要があります。APIは機能し、値コントローラーから値を正常に取得できます。

スタートアップクラスの構成は、この記事で説明されているとおりです( GitHubのSwashbuckle.AspNetCore )。

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", 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)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

            // Enable middleware to serve generated Swagger as a JSON endpoint.
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
            });
        }
        else
        {
            app.UseExceptionHandler();
        }

        app.UseStatusCodePages();
        app.UseMvc();

        //throw new Exception();
    }
}

NuGetリファレンスを確認できます...

enter image description here

繰り返しますが、これはすべてデフォルトのテンプレートですが、参照用にValuesControllerを含めています...

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}
31
John Livermore

Configureで次の2行を見逃したと思います。

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();

    // Enable middleware to serve generated Swagger as a JSON endpoint.
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyAPI V1");
    });
}

Swagger UIにアクセスするには、URLを http:// localhost:XXXX/swagger / にする必要があります

JsonはSwagger UIの上部にあります。

enter image description here

26
TiagoBrenck
#if DEBUG
   // For Debug in Kestrel
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");
#else
   // To deploy on IIS
   c.SwaggerEndpoint("/webapi/swagger/v1/swagger.json", "Web API V1");
#endif

IIS webapi(base URL)にデプロイされると、アプリケーションエイリアスになります。 swaggerは「/swagger/v1/swagger.json」の場所でswagger.jsonを探しますが、アプリケーションエイリアス(ベースURL)のプレフィックスは付けないため、すべてのIISデプロイメントに対してアプリケーションエイリアス(ベースURL)を維持する必要があります。それが機能しない理由です。

例えば:

localhost/swagger/v1/swagger.json-swagger.jsonが見つかりませんでした

16

同じ問題がありました。 http:// localhost:XXXX/swagger/v1/swagger.json を確認してください。エラーが発生した場合は、修正してください。

たとえば、ベースコントローラークラスにあいまいなルートがあり、「アクションのあいまいなHTTPメソッド。アクションにはSwagger 2.0の明示的なHttpMethodバインディングが必要です。」というエラーが表示されました。ベースコントローラーを使用する場合は、パブリックメソッドがHttpGet/HttpPost/HttpPut/HttpDelete OR Route属性を使用して、あいまいなルートを避けるようにしてください。

それから、同じメソッドでHttpGet( "route")とRoute( "route")の両方の属性を定義しました。これはswaggerの最後の問題でした。

11

私は似たような問題に直面していましたが、swaggerの問題はまったく同じではありませんでした。うまくいけば、これは他の人の助けになります。

カスタムドキュメントタイトルを使用しており、ドキュメントタイトルに一致するようにSwaggerEndPointのフォルダーパスを変更していませんでした。エンドポイントをswagger/v1/swagger.jsonに向けたままにすると、swagger UIでjsonファイルが見つかりません。

例:

services.AddSwaggerGen(swagger =>
        {
            swagger.SwaggerDoc("AppAdministration", new Info { Title = "App Administration API", Version = "v1.0" });

        });


 app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/AppAdministration/swagger.json", "App Administration");
        });
9
Aaron Herchmer

アプリケーションがIIS/IIS Expressでホストされている場合は、次を試してください。

c.SwaggerEndpoint("../swagger/v1/swagger.json", "MyAPI V1");
7

次の2つの規則に従う必要があります。

  1. [HttpGet("xxx")]の代わりに、[HttpPost("xxx")][Route("xxx")]または...などの明示的なHttpメソッドですべてのアクションを装飾します。
  2. [NoAction]属性を使用して、コントローラーのパブリックメソッドを飾ります。

http:// localhost:XXXX/swagger /http:// localhost:XXXX/swagger/v1/swagger.json ファイルのページリクエストですが、例外は上記のルールに従わない場合、Swaggerから発生します。

6

答えを見て、推奨事項を確認した後、何が間違っていたのか見当もつかないことになります。

文字通りすべてを試したので、同じ状況に陥った場合は、問題は別のものであり、完全に無関係であることを理解してください。

私の場合、OData例外でした。

Localhost:xxxx/swaggerを開いて開発者ツールを開き、コンソールのエラーをクリックすると、問題の原因となっている内部例外が表示されます。

役立つことを願っています

4
k.explorer

Swaggerを使用するときによく発生するエラーは、(NET ASP)に複数のルートに同じ名前を付けることです。このため、swaggerはJSONファイルを生成できません。たとえば、これは間違った方法です

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}

ルート名は同じだがアクション名が異なる他のアクション

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}

これは正しい方法です

[HttpPost, Route("Start")]
public async Task<TransactionResult> WipStart(BodyWipStartDTO data)
{
    return await _wipServices.WipStart(data);
}

[HttpPost, Route("Abort")]
public async Task<TransactionResult> WipAbort(BodyWipStartDTO data)
{
    return await _wipServices.WipAbort(data);
}
1

個人的に私は同じ問題を抱えていましたが、しばらくして今日もう一度試してみると、新しいバージョン(2.5.0)で json になっていることがわかりました-にあったエラーの説明を見ることができました- ここ

また、解決に役立ったもう1つのことは、ソリューションフォルダーのルートにある "..vs\config\applicationhost.config"内に保持されているWebサイトに接続されているホスティング情報を削除することでした。

Webサイトを構成していた要素を削除しました。

           <site name="**" id="9">
              <application path="/" applicationPool=""></application>
              <bindings></bindings>
           </site>
1
Alberto

必要な依存関係がすべて揃っていることを確認し、1つ以上の依存関係が欠落していることがわかるURL xxx/swagger/v1/swagger.jsonに移動します。

enter image description here

0
Rui Lima

また、次のようにIISレベルでアプリケーションをバージョン管理していたため、問題が発生しました。

enter image description here

これを行う場合、Configureメソッドでの構成は、以下のようなバージョン番号を追加する必要があります。

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/1.0/swagger/V1/swagger.json", "Static Data Service");
});
0
Rajmond Burgaj

Chrome開発者ツールを見てください。時々、swagger.jsonリクエストがhttp 500を投げます。魔女は、コントローラーに矛盾があることを意味します。例:私の場合、「アクションのあいまいなHTTPメソッド」があります。

enter image description here

0
Alexandre

Postパラメーターで内部クラスを使用したときにこの問題が発生しました

[HttpPost]
public async Task Post([FromBody] Foo value)
{
}

フーはどこ

public class Foo
{
    public IEnumerable<Bar> Bars {get;set;}

    public class Bar
    {
    }
}
0
Cassio Tavares

URLバージョン管理の代わりにバージョンヘッダーを使用してAPIのバージョン2を作成すると、このSwaggerエラーが発生しました。回避策は、バージョン1メソッドに[Obsolete]属性を追加し、SwaggerGeneratorOptionsを使用して、Startup-> ConfigureServicesメソッドの廃止されたAPIメソッドを無視することでした。

services.AddSwaggerGen(c =>
{
    c.SwaggerGeneratorOptions.IgnoreObsoleteActions = true;
    c.SwaggerDoc("v2", new Info { Title = "My API", Version = "v2" });
});
0
TomFp

同じ問題に遭遇しましたが、私のAPIがルートフォルダーと仮想ディレクトリでホストされていないことに気付きました。 APIをIISのルートフォルダーに移動して作業しました。

詳細 この回答では

0
DanielV

コントローラーに固有のURLにマップする問題がある場合、このエラーが発生します。

問題の原因を見つける最良の方法は、すべてのコントローラーをプロジェクトから除外することです。次に、1つのコントローラーまたはコントローラー内の1つ以上のメソッドを一度に有効にしてアプリを実行し、問題のあるコントローラー/コントローラーメソッドを見つけます。または、賢くなり、バイナリ検索ロジックを実行して、無効な複数のコントローラー/メソッドを有効にして、障害のあるコントローラー/メソッドを見つけます。

原因のいくつかは

  1. HTTPメソッド属性のないパブリックメソッドをコントローラーに持つ

  2. 「[アクション]」ベースのマッピングを使用していない場合、同じapi呼び出しにマップできる同じHttp属性を持つ複数のメソッドがある

0
Ram

簡単できれいなこれらの手順に従ってください。

  1. Ambiguous HTTP method for action. Actions require an explicit HttpMethod binding for Swagger 2.0.」などのエラーが表示される場合は、コンソールを確認してください
  2. YESReasonの場合:Swaggerが期待

各エンドポイントにはメソッドが必要です(get/post/put/delete)

Solution

各コントローラーを再確認し、期待されるメソッドが追加されていることを確認してください。

(または、どのコントローラーがあいまいさを引き起こしているかをコンソールエラーで確認できます)

  1. NOの場合。 問題が見つかった場合は、問題と解決策をお知らせください
0
UniCoder