新しい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日)には関連しない可能性があります
最初は500エラーも発生しました。スタックトレースの詳細:System.NotSupportedException:パス 'api/hotels'の無制限のHTTP動詞。 HttpMethodAttributeがありませんか?
私のAPIメソッドの1つのHttpGet属性が欠けていたことが判明しました:
[Microsoft.AspNetCore.Mvc.HttpGet]
関数の1つがpublic
としてマークされたときにこのエラーが発生しましたが、直接呼び出すことができるWebサービスを意図していませんでした。
関数をprivate
に変更すると、エラーがなくなりました。
または、public
関数の直前に[NonAction]
コマンドを配置して、Swaggerに無視するように指示することもできます。
[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{
...
}
(Swaggerが、実際にはこの問題を引き起こした関数のnameを報告することを望みます。「../ swagger/v1/swagger.json "ファイル...特に有用ではありません。)
最初に、Configure()にapp.UseDeveloperExceptionPage();
を追加してデベロッパー例外ページを有効にし、どちらが根本的な原因であるかを確認できます。ご覧ください こちら
私の場合、問題はSwaggerを機能させるためにMicrosoft.AspNetCore.StaticFiles
nugetもインストールする必要があることでした。
Swashbuckle.AspNetCore
nugetのアンインストール/再インストールも試してください。
例外の原因を確認するには
明らかかもしれませんが、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は期待どおりに機能しました。
ここで私のために働いた解決策が掲載されていないので、進行中のスレッドに貢献します。私の場合、Route属性は関数レベル(コントローラーレベルではない)でHttpPost/HttpGetを使用して個別に設定されていました。
間違った:
[HttpPost]
[Route("RequestItem/{itemId}")]
修正:
[HttpPost("RequestItem/{itemId}")]
また、Swaggerは、成功する要求が返されるため、StatusCode(object)の結果ではなくOk(object)の結果を予期しているようです。
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"});
});
パラメーターVersionを追加すると機能します
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
});
私にとっては、名前が同じで名前空間が異なる2つのクラスタイプがあり、異なるコントローラーの2つの異なるアクションの戻り値の型として使用されているためです!
それらのいずれかの名前を変更すると、問題は解決しました!
この問題もありました。私の場合、同じコントローラー内の同じルートとメソッド名を持つ2つのエンドポイントが原因でした(ただし、パラメータータイプは異なります)。もちろん、それはとにかくおそらくそれはおそらく貧弱なプラクティスであることが明らかになったので、エンドポイント名を変更し、すべてが順調でした。
また、追加する場合、コントローラーのルートレベルでルーティングするときに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();
}
}
内部サーバーエラーが発生する理由は、このルーティングの問題が原因であると考えるのに時間がかかりました。これが誰かを助けることを願っています!
今日、この問題に遭遇しました。Swaggerを.Net Core 2.2 Web Apiプロジェクトで構成しました。私がプロジェクトにMicrosoft.AspNetCore.StaticFiles
依存関係を含めることで、@ Popa Andreiが上記で言及したパスを開始しました。最終的にはうまくいきましたが、それは依存関係の連鎖のうさぎの穴に変わりました。
それから、ConfigureServices
のStartup
メソッドにservices.AddMvcCore(...)
があることに気付きました。これをservices.AddMvc(...)
に変更すると、Microsoft.AspNetCore.StaticFiles
で必要なすべての依存関係を手動で追加することなく機能し始めました。
だからと言って、services.AddMvcCore(...)
にとどまり、必要な依存関係をすべて追加するというルートをとることができないというわけではありません。あなたができる、そしてそれは動作します。
services.AddMvc(...)
アプローチをとるのがはるかに簡単です。
それが誰かを助けることを願っています。
私にとって問題はODataによるものでした。 services.AddOData();をコメントアウトしたばかりの場合。エラーは発生しませんでした。 services.AddOData(); をコメントアウトするだけです
場合によっては、コントローラーのルーターが重複しています。最後のcontroller変更を確認します。