web-dev-qa-db-ja.com

asp .net CORE / MVC 6アプリでSwaggerをセットアップする際の500エラー

新しいasp .net CORE/MVC 6プロジェクトで基本的なswagger APIドキュメントをセットアップしようとしていますが、swagger UIから500エラーを受け取りました:500 : http://localhost:4405/swagger/v1/swagger.json

私のスタートアップクラスには、次のコードが含まれています。

using Swashbuckle.SwaggerGen;
using Swashbuckle.SwaggerGen.XmlComments;
using Swashbuckle.Application;
....
public void ConfigureServices(IServiceCollection services)
{
  ...
  services.AddSwaggerGen();
  services.ConfigureSwaggerDocument(options =>
  {
    options.SingleApiVersion(new Info
    {
        Version = "v1",
        Title = "Blog Test Api",
        Description = "A test API for this blogpost"
    });
  });
}

そして、設定の下で:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
  app.UseSwaggerGen();
  app.UseSwaggerUi();
....
}

プロジェクトをビルドして実行すると、swagger/UI/index.htmlに移動するとUIが表示されますが、上記の500エラーが表示されます。 swagger/v1/swagger.jsonリンクにアクセスすると、コンソールに次の500エラーが表示されます:Failed to load resource: the server responded with a status of 500 (Internal Server Error)

500の根本的な原因を把握したり、swaggerで追加のデバッグを有効にして、このエラーがスローされている理由を把握する方法はありますか?私が見たいくつかのチュートリアルに基づいて、基本的な実装には起動時に必要なものだけが必要です。追加情報を提供できるかどうか教えてください。

編集:これはrc1用であり、現在リリースされている新しいnetcore 1.0(2016年6月29日)には関連しない可能性があります

45
CBerg

最初は500エラーも発生しました。スタックトレースの詳細:System.NotSupportedException:パス 'api/hotels'の無制限のHTTP動詞。 HttpMethodAttributeがありませんか?

私のAPIメソッドの1つのHttpGet属性が欠けていたことが判明しました:

[Microsoft.AspNetCore.Mvc.HttpGet]
93
hsop

Swaggerのスタックトレースに正確なエラーがあることを知りたい場合は、URLをリクエストします。

<your-app-url>/swagger/v1/swagger.json

または、ブラウザ開発ツールコンソールからswagger.jsonリンクをクリックします。

Chrome DevTools with error log

35
Zin Min

関数の1つがpublicとしてマークされたときにこのエラーが発生しましたが、直接呼び出すことができるWebサービスを意図していませんでした。

関数をprivateに変更すると、エラーがなくなりました。

または、public関数の直前に[NonAction]コマンドを配置して、Swaggerに無視するように指示することもできます。

[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{ 
   ...
}

(Swaggerが、実際にはこの問題を引き起こした関数のnameを報告することを望みます。「../ swagger/v1/swagger.json "ファイル...特に有用ではありません。)

5
Mike Gledhill

最初に、Configure()にapp.UseDeveloperExceptionPage();を追加してデベロッパー例外ページを有効にし、どちらが根本的な原因であるかを確認できます。ご覧ください こちら

私の場合、問題はSwaggerを機能させるためにMicrosoft.AspNetCore.StaticFiles nugetもインストールする必要があることでした。

Swashbuckle.AspNetCore nugetのアンインストール/再インストールも試してください。

3
Popa Andrei

例外の原因を確認するには

  • chromeブラウザを開きます
  • オープンな開発者ツール
  • コンソールタブの例外を参照してください
  • 修理する。
1
ddagsan

明らかかもしれませんが、HttpGetまたはHttpPost属性が欠落していることに加えて、postメソッドを区別することを忘れないでください。

HttpPostのマークが付いた2つの異なるメソッド(異なる名前)がある場合があり、このような問題も発生します。属性にメソッド名を指定することを忘れないでください:[HttpPost("update")]

Swaggerバージョンが互いに整列していることを確認すると、問題が修正されました。新しいプロジェクトを始めていたので、APIバージョンをv0.1に設定しました

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v0.1", new Info { Title = "Tinroll API", Version = "v0.1" });
});

しかし、私のswagger URLをv1のままにしていました。

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tinroll API v0.1");
    c.RoutePrefix = string.Empty;
});

バージョニングを/swagger/v0.1/swagger.jsonではなくv1に更新しましたが、Swaggerは期待どおりに機能しました。

0
Morgan Kenyon

ここで私のために働いた解決策が掲載されていないので、進行中のスレッドに貢献します。私の場合、Route属性は関数レベル(コントローラーレベルではない)でHttpPost/HttpGetを使用して個別に設定されていました。

間違った:

[HttpPost]

[Route("RequestItem/{itemId}")]

修正:

[HttpPost("RequestItem/{itemId}")]

また、Swaggerは、成功する要求が返されるため、StatusCode(object)の結果ではなくOk(object)の結果を予期しているようです。

0
Shinigamae

STARTUP.CSではSwaggerDocパラメーターにバージョンの名前を入れていないため、このエラーが発生していました。

エラー=> c.SwaggerDoc("", blablabla

WORK => c.SwaggerDoc("v1",blablabla

その後、今は大丈夫です!

services.AddSwaggerGen(c => 
    {
c.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info {Title = "PME SERVICES", Version = "v1"});
            });
0
Diego Venâncio

パラメーターVersionを追加すると機能します

services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });

私にとっては、名前が同じで名前空間が異なる2つのクラスタイプがあり、異なるコントローラーの2つの異なるアクションの戻り値の型として使用されているためです!

それらのいずれかの名前を変更すると、問題は解決しました!

0
Majid

この問題もありました。私の場合、同じコントローラー内の同じルートとメソッド名を持つ2つのエンドポイントが原因でした(ただし、パラメータータイプは異なります)。もちろん、それはとにかくおそらくそれはおそらく貧弱なプラクティスであることが明らかになったので、エンドポイント名を変更し、すべてが順調でした。

0
bsigma1

また、追加する場合、コントローラーのルートレベルでルーティングするときにswaggerセットアップが気に入らない場合もあります。例えば:

こんなことしないで:

[Produces("application/json")]
[Route("/v1/myController")]
[Authorize]
public class myController
{
    [SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
    [HttpPost]
    [Authorize()]
    public async Task<IActionResult> Create([FromBody] MyObject myObject)
    {
        return Ok();
    }
}

これを行う:

[Produces("application/json")]
[Authorize]
public class myController
{
    [SwaggerResponse((int)System.Net.HttpStatusCode.OK, Type = typeof(RestOkResponse<Response>))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.Forbidden, Type = typeof(RestErrorResponse))]
    [SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
    [HttpPost("/v1/myController")]
    [Authorize()]
    public async Task<IActionResult> Create([FromBody] MyObject myObject)
    {
        return Ok();
    }
}

内部サーバーエラーが発生する理由は、このルーティングの問題が原因であると考えるのに時間がかかりました。これが誰かを助けることを願っています!

0
Lostaunaum

今日、この問題に遭遇しました。Swaggerを.Net Core 2.2 Web Apiプロジェクトで構成しました。私がプロジェクトにMicrosoft.AspNetCore.StaticFiles依存関係を含めることで、@ Popa Andreiが上記で言及したパスを開始しました。最終的にはうまくいきましたが、それは依存関係の連鎖のうさぎの穴に変わりました。

それから、ConfigureServicesStartupメソッドにservices.AddMvcCore(...)があることに気付きました。これをservices.AddMvc(...)に変更すると、Microsoft.AspNetCore.StaticFilesで必要なすべての依存関係を手動で追加することなく機能し始めました。

だからと言って、services.AddMvcCore(...)にとどまり、必要な依存関係をすべて追加するというルートをとることができないというわけではありません。あなたができる、そしてそれは動作します。

services.AddMvc(...)アプローチをとるのがはるかに簡単です。

それが誰かを助けることを願っています。

0
Perry

私にとって問題はODataによるものでした。 services.AddOData();をコメントアウトしたばかりの場合。エラーは発生しませんでした。 services.AddOData(); をコメントアウトするだけです

0
shishir

場合によっては、コントローラーのルーターが重複しています。最後のcontroller変更を確認します。

0