103

新しい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 日) には関係ない可能性があります。

4

25 に答える 25

157

最初は500エラーも発生しました。System.NotSupportedException: Unbounded HTTP verbs for path 'api/hotels'. HttpMethodAttribute がありませんか?

API メソッドの 1 つに HttpGet 属性がないことが判明しました。

[Microsoft.AspNetCore.Mvc.HttpGet]
于 2016-08-16T07:30:55.700 に答える
12

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

関数を変更しprivateてエラーを解消しました。

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

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

(Swagger が「 ../swagger/v1/swagger.json 」ファイルを見つけることができなくなったと不平を言うのではなく、この問題の原因となった関数の名前を実際に報告してくれることを願っています...特に有用ではありません。 )

于 2018-05-22T15:09:35.317 に答える
3

今日、この問題が発生しました。原因は、コントローラー API のいくつかのメソッドに [HttpGet] がないことでした。

ここに画像の説明を入力

例外 (スタック トレース内) は問題を示しました。次のように、Visual Studio の [出力] ウィンドウで例外を確認することもできます (私の場合は表示されました)。

ここに画像の説明を入力

于 2019-12-06T09:46:15.787 に答える
1

また、追加する場合は、コントローラーのルートレベルでルーティングする場合、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();
    }
}

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

于 2017-09-13T15:04:32.613 に答える
1

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

でマークされた 2 つの異なるメソッド (異なる名前) が存在する可能性がありHttpPost、それもこの種の問題を引き起こす可能性があります。属性にメソッド名を指定することを忘れないでください: [HttpPost("update")]

于 2018-10-17T22:59:43.033 に答える
0

.Net Core 5 でデフォルトで有効になっている Swagger を使用する場合、メソッドについて何かを知る必要があります。[HttpGet]通常、属性はメソッドのデフォルトであるため追加する必要はありませんがHttpMethod、swagger ではコードのドキュメントを生成するためにその情報が必要です。

[HttpGet]したがって、私の方法の上に追加すると、問題が解決しました。

于 2020-12-21T16:01:15.257 に答える
-1

このプロジェクトを見てください。 https://github.com/domaindrivendev/Ahoy/tree/master/test/WebSites/Basic

このレポは Swashbuckle の所有者からのもので、基本的な ASP.NET 5 サンプル アプリです。これは、ミドルウェアを正しく構成するのに役立ちます (そして、ミドルウェアの順序に注意してください。たとえば、「app.UseSwaggerGen を使用します。 ();app.UseSwaggerUi(); app.UseMvc();の後)

アプリケーションでログを有効にするには、 https ://docs.asp.net/en/latest/fundamentals/logging.html?highlight=logging を参照してください (ログは「wwwroot」フォルダー内に生成されます)。

于 2016-03-04T15:47:53.623 に答える
-2

Swagger のセットアップは、バージョンによって大きく異なります。この回答は、Swashbuckle 6.0.0-beta9 および Asp.Net Core 1.0 に対するものです。Startup.cs の ConfigureServices メソッド内に、次を追加する必要があります。

 services.AddSwaggerGen(c =>
    {
      c.SingleApiVersion(new Info
      {
        Version = "v1",
        Title = "My Awesome Api",
        Description = "A sample API for prototyping.",
        TermsOfService = "Some terms ..."
      });
    });

次に、Configure メソッドで追加する必要があります-

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.UseMvc();
    app.UseSwaggerGen();
    app.UseSwaggerUi();
}

Startup.cs で参照していることを確認してください -

Swashbuckle.SwaggerGen.Generator の使用;

私のproject.jsonファイルは次のようになります-

"dependencies": {
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-*",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Swashbuckle": "6.0.0-beta9"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "net452": { }
  },
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "xmlDoc": false
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}
于 2016-06-09T15:56:50.080 に答える