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

Asp.net core mvc 在asp.net CORE/MVC 6应用程序中设置Swagger时出现500错误,asp.net-core-mvc,swashbuckle,Asp.net Core Mvc,Swashbuckle,我正在尝试在一个新的asp.net CORE/MVC 6项目中设置一个基本的swagger API文档,并从swagger UI收到一个500错误: 500:http://localhost:4405/swagger/v1/swagger.json [Microsoft.AspNetCore.Mvc.HttpGet] 我的startup类中包含以下代码: using Swashbuckle.SwaggerGen; using Swashbuckle.SwaggerGen.XmlComments

我正在尝试在一个新的asp.net CORE/MVC 6项目中设置一个基本的swagger API文档,并从swagger UI收到一个500错误:
500:http://localhost:4405/swagger/v1/swagger.json

[Microsoft.AspNetCore.Mvc.HttpGet]
我的startup类中包含以下代码:

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"
    });
  });
}
[Microsoft.AspNetCore.Mvc.HttpGet]
然后在“配置”下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
....
  app.UseSwaggerGen();
  app.UseSwaggerUi();
....
}
[Microsoft.AspNetCore.Mvc.HttpGet]
当我构建并运行项目时,当我转到swagger/UI/index.html时,会出现UI,但是上面的500错误会显示出来。当我转到swagger/v1/swagger.json链接时,console会给出以下500个错误:
加载资源失败:服务器响应状态为500(内部服务器错误)

[Microsoft.AspNetCore.Mvc.HttpGet]
是否有任何方法可以找出500的根本原因,或者在swagger中启用任何额外的调试来找出它抛出此错误的原因?根据我看过的一些教程,基本实现只需要我在startup中拥有的东西。如果我能提供任何其他信息,请告诉我

[Microsoft.AspNetCore.Mvc.HttpGet]

编辑:这是针对rc1的,可能与当前推出的新netcore 1.0(2016年6月29日)无关。

看看这个项目。
[Microsoft.AspNetCore.Mvc.HttpGet]

[Microsoft.AspNetCore.Mvc.HttpGet]
此repo来自Swashback的所有者,是一个基本的ASP.NET 5示例应用程序,它可以帮助您正确配置您的中间件(并注意它们的订单,这很重要,例如,使用“app.UseSwaggerGen();app.UseSwaggerUi();after app.UseMvc();)

[Microsoft.AspNetCore.Mvc.HttpGet]
要在应用程序中启用日志记录,请查看:
(日志将在“wwwroot”文件夹中生成。

Swagger的设置因版本而异。此答案适用于Swashback 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 ..."
      });
    });
[Microsoft.AspNetCore.Mvc.HttpGet]
然后在Configure方法中必须添加-

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

    app.UseMvc();
    app.UseSwaggerGen();
    app.UseSwaggerUi();
}
[Microsoft.AspNetCore.Mvc.HttpGet]
确保您正在Startup.cs中引用-

[Microsoft.AspNetCore.Mvc.HttpGet]
使用Swashback.SwaggerGen.Generator

[Microsoft.AspNetCore.Mvc.HttpGet]
我的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%" ]
  }
}
[Microsoft.AspNetCore.Mvc.HttpGet]

起初我也有一个500错误。在堆栈跟踪的深处,它说: System.NotSupportedException:路径“api/hotels”的无界HTTP谓词。是否缺少HttpMethodAttribute

[Microsoft.AspNetCore.Mvc.HttpGet]
事实证明,我的一个api方法缺少一个HttpGet属性:

[Microsoft.AspNetCore.Mvc.HttpGet]

另外,如果我可以补充的话,当您在控制器的根级别进行路由时,swagger设置不喜欢它。例如:

[Microsoft.AspNetCore.Mvc.HttpGet]
不要这样做:

[Microsoft.AspNetCore.Mvc.HttpGet]
[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();
    }
}
[产生(“应用程序/json”)]
[路线(“/v1/myController”)]
[授权]
公共类myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK,Type=typeof(RestOkResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.probled,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost]
[授权()]
公共异步任务创建([FromBody]MyObject MyObject)
{
返回Ok();
}
}
这样做:

[Microsoft.AspNetCore.Mvc.HttpGet]
[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();
    }
}
[产生(“应用程序/json”)]
[授权]
公共类myController
{
[SwaggerResponse((int)System.Net.HttpStatusCode.OK,Type=typeof(RestOkResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.InternalServerError,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.BadRequest,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.probled,Type=typeof(RestErrorResponse))]
[SwaggerResponse((int)System.Net.HttpStatusCode.NotFound)]
[HttpPost(“/v1/myController”)]
[授权()]
公共异步任务创建([FromBody]MyObject MyObject)
{
返回Ok();
}
}

我花了一段时间才意识到,我出现内部服务器错误的原因是因为这个路由问题。希望这对其他人有所帮助!

首先,您可以通过在Configure()上添加
app.usedeveloperceptionpage();
来启用de-developer异常页面,以便更好地了解根本原因。请看一看

[Microsoft.AspNetCore.Mvc.HttpGet]
在我的例子中,问题是我还必须安装
Microsoft.AspNetCore.StaticFiles
nuget才能使Swagger工作

[Microsoft.AspNetCore.Mvc.HttpGet]

还可以尝试卸载/重新安装
swashback.AspNetCore
nuget。

当我的一个函数被标记为
public
时,我出现了这个错误,但它不是一个可以直接调用的web服务

[Microsoft.AspNetCore.Mvc.HttpGet]
将函数更改为
private
可消除错误

[Microsoft.AspNetCore.Mvc.HttpGet]
或者,在您的
public
函数之前,您可以放置
[NonAction]
命令,告诉Swagger忽略它

[Microsoft.AspNetCore.Mvc.HttpGet]
[NonAction]
public async Task<IActionResult> SomeEvent(string id)
{ 
   ...
}
[非动作]
公共异步任务SomeEvent(字符串id)
{ 
...
}

(我希望Swagger能够报告导致此问题的函数名,而不是抱怨它再也找不到“./Swagger/v1/Swagger.json”文件……这不是特别有用。)

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

[Microsoft.AspNetCore.Mvc.HttpGet]
<your-app-url>/swagger/v1/swagger.json
/swagger/v1/swagger.json
或者,单击浏览器开发工具控制台中的
swagger.json
链接:

[Microsoft.AspNetCore.Mvc.HttpGet]

[Microsoft.AspNetCore.Mvc.HttpGet]
这将显示IDE输出中的错误:

[Microsoft.AspNetCore.Mvc.HttpGet]

当我添加参数版本时,它可以工作

[Microsoft.AspNetCore.Mvc.HttpGet]
services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
        });

可能很明显,但是除了缺少
HttpGet
HttpPost
属性之外,别忘了区分post方法

[Microsoft.AspNetCore.Mvc.HttpGet]

您可能有两个不同的方法(具有不同的名称)标记为
HttpPost
,这也会导致此类问题。请记住在属性中指定方法名称:
[HttpPost(“更新”)]

以查看异常源

[Microsoft.AspNetCore.Mvc.HttpGet]
  • 打开chrome浏览器
  • 开放式开发工具
  • 请参见控制台选项卡中的异常
  • 修好它

    • 也有这个问题。在我的例子中,它是由th中的两个端点引起的