500在asp .net CORE/MVC 6应用程序中设置Swagger时出错

CBe*_*erg 50 asp.net-core-mvc swashbuckle

我正在尝试在新的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"
    });
  });
}
Run Code Online (Sandbox Code Playgroud)

然后在Configure下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
  app.UseSwaggerGen();
  app.UseSwaggerUi();
....
}
Run Code Online (Sandbox Code Playgroud)

当我构建并运行项目时,当我转到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日)

hso*_*sop 96

最初我也遇到了500错误.在堆栈跟踪的深处它说:System.NotSupportedException:路径'api/hotels'的无界HTTP谓词.你错过了HttpMethodAttribute吗?

原来我错过了一个api方法的HttpGet属性:

[Microsoft.AspNetCore.Mvc.HttpGet]
Run Code Online (Sandbox Code Playgroud)

  • 你从哪里得到这个错误信息? (3认同)
  • 你在哪里得到堆栈跟踪?我只是在我的网络客户端得到500错误,没有进一步的信息.服务器不会抛出异常. (3认同)
  • 打开 API 的 Swagger 文档站点(即 https://myapi.somedomain.com/help/index)时出现错误消息和堆栈跟踪 (3认同)
  • 如果不应该将方法添加到 swagger,则可以将其设置为 protected (2认同)
  • Swagger 确实应该使用自定义错误来处理此问题。 (2认同)
  • 该死的,为什么 swagger 仍然如此原始和未经修饰,这是非常基本的东西:C (2认同)

Zin*_*Min 42

如果有人想知道Swagger的堆栈跟踪中的确切错误,请请求URL:

<your-app-url>/swagger/v1/swagger.json
Run Code Online (Sandbox Code Playgroud)

或者,单击swagger.json浏览器开发工具控制台中的链接:

带有错误日志的Chrome DevTools

  • 这是找出真正问题所在的完美方法。非常感谢! (6认同)
  • @ohdev检查中间件管道的顺序。如果 UseSwagger 出现在任何类型的异常处理/日志记录之前,则可能会导致不记录任何错误 (4认同)
  • 希望我能更多地支持这一点。网上有很多关于此问题的帖子,通常都是猜测问题所在,而不是如何调试的建议。这种调试方法其实就是我想知道的。 (2认同)
  • 不为我工作。单击链接或转到地址时出现错误 500。 (2认同)
  • 另一种快速方法是转到 chrome 调试器 -&gt; 网络选项卡 -&gt; 预览。您将获得错误的堆栈跟踪。 (2认同)

Maz*_*bra 9

就我而言,我缺少 API 控制器中存在的路由属性中的操作。

像这样的事情:

[Route("api/[controller]/[action]")]
Run Code Online (Sandbox Code Playgroud)

之前我有:

[Route("api/[controller]")]
Run Code Online (Sandbox Code Playgroud)

编写[Route("api/[controller]")]时会发生错误,因为 swagger 不知道如何在路由属性内不执行操作的情况下分离 API 方法。


小智 8

我今天遇到了这个问题,原因是我的控制器 API 上的一些方法丢失了 [HttpGet]:

在此输入图像描述

异常(在堆栈跟踪中)向我展示了问题您还可以在 Visual Studio 的“输出”窗口中检查异常,如下所示(在我的情况下,它向我展示了):

在此输入图像描述


小智 7

如果您无法加载,请查看此处并在控制台中查看 swagger.json。

Swagger 很难协调命名空间之间的差异。当构建 api 调用所需的对象时,它将通过每个定义的类进行索引。如果有两个类共享一个类名,它将无法处理 swagger.json 文件。

.Net 将正确处理但 Swagger 不会正确处理的两个类的示例。

namespace MyCompany.PaymentProcessor.DTO
{

    public class Payment
    {
      //dto content
    }
}
Run Code Online (Sandbox Code Playgroud)

namespace MyCompany.CbData
{

    public class Payment
    {
       //couch base data
    }
}
Run Code Online (Sandbox Code Playgroud)

.Net 会正确处理,但 swagger 无法解析。


Pop*_*rei 6

首先,您可以通过添加app.UseDeveloperExceptionPage();Configure()来启用 de developer exception 页面,以便更好地了解哪个是根本原因。看看这里

就我而言,问题是我还必须安装Microsoft.AspNetCore.StaticFilesnuget 才能使 Swagger 工作。

还尝试卸载/重新安装Swashbuckle.AspNetCorenuget。

  • 卸载/重新安装 Swashbuckle.AspNetCore 对我不起作用 (2认同)

Mik*_*ill 5

当我的一个功能被标记为时public,我收到了此错误,但它并不意味着它是可以直接调用的Web服务。

更改功能以private消除错误。

另外,在public函数之前,您可以放置[NonAction]命令,告诉Swagger忽略它。

[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{ 
   ...
}
Run Code Online (Sandbox Code Playgroud)

(我希望Swagger实际上会报告导致此问题的函数的名称,而不是仅仅抱怨它无法找到“ ../swagger/v1/swagger.json ”文件...这并不是特别有用。 )