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

我正在尝试在一个新的 ASP 中设置一个基本的 swagger API 文档。Net CORE/MVC 6项目,并收到一个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的根本原因或者启用任何额外的调试来找出它为什么抛出这个错误?基于我看过的一些教程,只有我在启动阶段的东西是基础实现所必需的。请让我知道,如果我可以提供任何额外的信息。

编辑: 这是针对 rc1的,可能与当前发布的新 netcore 1.0无关(6/29/2016)

206956 次浏览

看看这个项目。 Https://github.com/domaindrivendev/ahoy/tree/master/test/websites/basic

这个回购是来自 Swashuckle 的所有者,是一个基本的 ASP.NET 5示例应用程序,这是帮助你正确配置你的中间件(并注意他们的订单,这很重要,例如,使用“应用程序。UseSwaggerGen () ; app.UseSwaggerUi () ; after app.UseMvc () ;)

要在应用程序中启用日志记录,请看以下内容: Https://docs.asp.net/en/latest/fundamentals/logging.html?highlight=logging (日志将在“ wwwroot”文件夹中生成

斯威格的设置在不同的版本之间有很大的不同。这个答案适用于 Swashuckle6.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-中引用

使用 Swashuckle.SwaggerGen. 发生器;

我的 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%" ]
}
}

最初我也得到了一个500错误,在堆栈跟踪的深处写道: System.NotSupportdException: 路径‘ api/hotel’的无界 HTTP 动词。是否缺少 HttpMethodAttribute?

原来我的一个 api 方法缺少一个 HttpGet 属性:

[Microsoft.AspNetCore.Mvc.HttpGet]

如果你使用一个带有“ Get (int id)”参数的方法 你会得到同样的错误没有解释,所以你需要添加到装饰 “[ HttpGet (”{ id: int }“)]”

另外,如果我可以补充,大摇大摆设置不喜欢它时,您路由在根级别的控制器。例如:

不要这样做:

[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();
}
}

我花了一段时间才弄明白为什么会出现内部服务器错误是因为这个路由问题。希望这对谁有帮助!

首先,您可以通过在 Configure ()上添加 app.UseDeveloperExceptionPage();来启用开发人员异常页面,以便更好地查看哪个是根本原因。看看 给你

在我的情况下,问题是,我必须安装也 Microsoft.AspNetCore.StaticFiles的核心,以使斯威格的工作。

还可以尝试卸载/重新安装 Swashbuckle.AspNetCore

当我的一个函数被标记为 public时,我得到了这个错误,但是它并不是一个可以直接调用的 Web 服务。

将函数更改为 private使错误消失。

或者,在你的 public函数之前,你可以放置 [NonAction]命令,告诉斯威格忽略它。

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

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

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

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

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

Chrome DevTools with error log

它将在 IDE 输出中显示错误:

enter image description here

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

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

可能是显而易见的,但是除了缺少 HttpGetHttpPost属性之外,不要忘记区分 post 方法。

您可能有两个不同的方法(使用不同的名称)标记为 HttpPost,这也会导致这种问题。请记住在属性中指定方法名称: [HttpPost("update")]

查看异常源

  • 开放式 Chrome 浏览器
  • 开放式开发工具
  • 在控制台选项卡中查看异常
  • 修好它。

也有这个问题。在我的例子中,它是由同一控制器中具有相同路由和方法名称(但参数类型不同)的两个端点引起的。当然,很明显,这可能是一个糟糕的实践,所以我更改了端点名称,一切都很好。

在某些情况下,控制器路由器控制器路由器是重复的。

我得到这个错误是因为在 STARTUP.CS 中,我没有把版本的名称放在 SwaggerDoc 参数中:

错误 = > c.SwaggerDoc("", blablabla

工作 = > c.SwaggerDoc("v1",blablabla

那么,现在好了,好了!

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

我今天遇到了这个问题。Net Core 2.2 Web Api 项目。我开始沿着@Popa Andrei 上面提到的路径,在我的项目中包含 Microsoft.AspNetCore.StaticFiles依赖项,因为我认为这很可能是罪魁祸首。这变成了一个依赖链条的兔子洞,尽管它最终对我有用。

然后我意识到在我的 StartupConfigureServices方法中,我有 services.AddMvcCore(...),它只给你提供基本的框架,你可以根据需要添加依赖关系。当我把它改为 services.AddMvc(...)时,它就开始工作了,无需手动添加 Microsoft.AspNetCore.StaticFiles所需的所有依赖项。

这并不意味着您不能使用 services.AddMvcCore(...),然后添加所有必要的依赖项。你可以,而且会成功的。

只是采用 services.AddMvc(...)方法并完成它要容易得多。

希望这对某人有帮助。

确保我的大摇大摆版本排成一排解决了我的问题。因为我要开始一个新项目,所以我将 api 版本设置为 v0.1

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

但是把我的炫耀网址改成了 V1。

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

我更新了我的版本为 /swagger/v0.1/swagger.json而不是 v1,斯威格按预期工作。

因为我没有看到解决方案为我工作在这里张贴,我将贡献一个正在进行的线程。在我的示例中,是在函数级(而不是控制器级)使用 HttpPost/HttpGet 单独设置 Route 属性。

错误:

[HttpPost]


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

正确:

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

另外,Swagger 似乎希望成功请求返回的结果是 OK (object)结果,而不是 StatusCode (object)结果。

对我来说,这是因为有两个具有相同名称但具有不同名称空间的类类型,它们被用作不同控制器中两个不同操作的返回类型!

当我改了其中一个的名字,问题就解决了!

对我来说,问题出在 OData 上。如果我只是评论我的服务。我没有得到任何错误

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

enter image description here

异常(在堆栈跟踪中)向我显示了问题 您还可以在 VisualStudio 的 Output 窗口中检查异常,如下所示(在我的示例中,它显示了这个异常) :

enter image description here

遇到了同样的问题,错误消息帮助我找到了根本原因:

{
"error": "Conflicting method/path combination \"POST api/calls\" for actions - SMSApi_v2.Controllers.CallController.CreateCall (SMSApi_v2),SMSApi_v2.Controllers.CallController.CreateCalls (SMSApi_v2). Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround"
}

根源是这些代码行:

    **[HttpPost("calls")]**
public IActionResult CreateCall([FromBody]Call call)
{
repository.Create(call);
return Ok(call);
}


**[HttpPost("calls")]**
public IActionResult CreateCalls([FromBody] string xmlFile)
{
var calls = xmlProcessor.DeserializeTo<List<Call>>(xmlFile);
if (!calls.Any())
return BadRequest("Deserializing was not done correctly.");


repository.Create(calls);
return Ok(calls);
}

即使方法的签名不同,两个 API 谓词也有相同的路由,这会产生错误。

我在 ASP.NET 样板中得到了相同的错误。我搜索了很多,发现我的代码有一个问题。我使用同名的两个 DTO 对象,但是位于不同的名称空间。

例如,第一个 DTO 对象如下:

namespaces Test{
public class TestDto
{
public int Id{get;set;}
}
}

第二个 DTO 对象如下:

namespaces Test_2{
public class TestDto
{
public int Id{get;set;}
}
}

我更改了 Test _ 2. TestDto 的名称,之后问题确实解决了。

如果使用 Swagger,则默认情况下在。网络核心5,它需要知道一些关于你的方法。通常,您不需要添加 [HttpGet]属性,因为它是方法的默认 HttpMethod,但是 swagger 需要这些信息来生成代码的文档。

因此,在我的方法上面添加 [HttpGet]解决了我的问题。

在我的例子中,一个模型与另一个模型具有相同的名称,我修改了名称的更改

如果您无法加载并查看控制台中的 swagger.json,请看这里。

斯威格在处理名称空间之间的差异时遇到了困难。当构建 api 调用所需的对象时,它将索引每个定义的类。如果有两个类共享一个类名,它将无法处理 swagger.json 文件。

例如两个类,.Net 会正确处理,但是 Swagger 不会。

namespace MyCompany.PaymentProcessor.DTO
{


public class Payment
{
//dto content
}
}

还有

namespace MyCompany.CbData
{


public class Payment
{
//couch base data
}
}

会被.Net 正确的对待,但是不能被大摇大摆的解决。

在我的例子中,我在路由属性中缺少了一个动作,这个动作存在于你的 API 控制器中。

就像这样:

[Route("api/[controller]/[action]")]

之前:

[Route("api/[controller]")]

在编写 [ Route (“ api/[ controller ]”)]时会出现一个错误,因为 swagger 不知道如何分离 API 方法,而不在您的路由属性中执行操作。

  1. 在 API 操作之上添加 [ HttpGet ]或[ HttpPost ]。

  2. 在 api 操作之上添加 [ Reout (“ YourApiActionName”)],

    或者在 Controller 类的顶部添加 [路由(“[控制器]/[动作]”)]

enter image description here