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

时间:2016-03-04 05:51:55

标签: 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"
    });
  });
}

然后在Configure:

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日)

23 个答案:

答案 0 :(得分:22)

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

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

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

Chrome DevTools with error log

答案 1 :(得分:3)

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

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

.Net 可以正确处理但 Swagger 不能正确处理的两个类的示例。

namespace MyCompany.PaymentProcessor.DTO
{

    public class Payment
    {
      //dto content
    }
}

namespace MyCompany.CbData
{

    public class Payment
    {
       //couch base data
    }
}

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

答案 2 :(得分:3)

首先,您可以通过在Configure()上添加Microsoft.AspNetCore.StaticFiles来启用de developer exception页面,以便更好地了解哪个是根本原因。看看here

在我的情况下,问题是我必须同时安装Swashbuckle.AspNetCore nuget才能使Swagger工作。

还尝试卸载/重新安装public class MainActivity extends AppCompatActivity { private CalculationReceiver calculationReceiver = new CalculationReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); final Context mContext = this; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { calculationReceiver.doAddition(mContext, 2, 2); } }); } } nuget。

答案 3 :(得分:3)

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

将功能更改为private会使错误消失。

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

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

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

答案 4 :(得分:1)

就我而言,一个模型与另一个模型同名,我修复了更改名称

答案 5 :(得分:1)

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

您可能有2种用HttpPost标记的不同方法(名称不同),这也会引起这种问题。请记住在属性[HttpPost("update")]中指定方法名称。

答案 6 :(得分:1)

有同样的问题,错误消息帮助我确定了根本原因:

'<html>
   <a target="_blank" id="Link" href="https://website.com/rectype=142&id='||{internalid}||'">
     <button  id="Button" type="button" onclick=test();> Check-In 
     </button>
   </a>
   <script> 
      function test() {var x = document.getElementById("Link").href; alert(x);} 
   </script> 
 </html>'

根源是这些代码行:

{
  "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"
}

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

答案 7 :(得分:1)

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

enter image description here

异常(在堆栈跟踪中)显示了我的问题 您也可以像这样在Visual Studio的“输出”窗口中检查异常(在我的情况下,该异常向我显示):

enter image description here

答案 8 :(得分:0)

我收到此错误是因为在STARTUP.CS中,我没有在SwaggerDoc参数中输入版本名称:

错误=> select p.* from prelevement p inner join( select facture, max(date_op) as 'date' from prelevement group by facture) p1 on p.facture=p1.facture and p.date_op=p1.date;

WORK => c.SwaggerDoc("", blablabla

然后,现在可以了!

c.SwaggerDoc("v1",blablabla

答案 9 :(得分:0)

如果您使用 Swagger(在 .Net Core 5 中默认启用),它需要了解您的方法。通常,您不需要添加 [HttpGet] 属性,因为它是您方法的默认 HttpMethod,但 swagger 需要该信息来生成您的代码文档。

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

答案 10 :(得分:0)

我在ASP.NET Boilerplate中遇到相同的错误。我进行了很多搜索,发现我的代码有问题。我使用相同名称的两个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.TestD的名称,之后问题确实为我解决了。

答案 11 :(得分:0)

对我来说,问题出在OData。如果我只是注释掉我的services.AddOData();我没有任何错误。just comment out the services.AddOData();

答案 12 :(得分:0)

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

当我更改其中一个的名称时,问题解决了!

答案 13 :(得分:0)

由于我在这里看不到对我有用的解决方案,因此我将为正在进行的线程做一个贡献。就我而言,这是Route属性与HttpPost / HttpGet分别在功能级别(而不是控制器级别)设置的。

错误:

[HttpPost]

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

正确:

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

此外,Swagger似乎期望Ok(对象)结果而不是StatusCode(对象)结果才能返回成功请求。

答案 14 :(得分:0)

确保我的各种版本都可以解决我的问题。因为我开始一个新项目,所以我将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,并且Swagger的工作符合预期。

答案 15 :(得分:0)

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

然后,我意识到在ConfigureServices的{​​{1}}方法中,我拥有Startup,它为您提供了基础知识,并在需要时添加了依赖项。当我将其更改为services.AddMvcCore(...)时,它开始工作,而无需手动添加services.AddMvc(...)所需的所有依赖项。

这并不意味着您不能选择Microsoft.AspNetCore.StaticFiles,然后添加所有必要的依赖项。可以,它将起作用。

采用services.AddMvcCore(...)方法并完成操作要容易得多。

希望能帮助某人。

答案 16 :(得分:0)

在某些情况下,控制器路由器是重复的。查看最后修改的控制器

答案 17 :(得分:0)

也有这个问题。就我而言,这是由同一控制器中具有相同路由和方法名称(但参数类型不同)的两个端点引起的。当然,然后很明显,无论如何这都是很差的做法,所以我更改了端点名称,一切都很好。

答案 18 :(得分:0)

查看异常源

  • 打开Chrome浏览器
  • 打开开发人员工具
  • 在控制台标签中查看例外情况
  • 修复它。

答案 19 :(得分:0)

当我添加参数Version时,它起作用

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

答案 20 :(得分:0)

另外,如果我可以添加,当您在控制器的根级别路由时,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();
    }
}

我花了一段时间才发现我收到内部服务器错误的原因是因为这个路由问题。希望这有助于某人!

答案 21 :(得分:-1)

看看这个项目。 https://github.com/domaindrivendev/Ahoy/tree/master/test/WebSites/Basic

此repo来自Swashbuckle的所有者,是一个基本的ASP.NET 5 Sample应用程序,这可以帮助您更正配置您的中间件(并注意它们的顺序,这很重要,例如,使用“ app.UseSwaggerGen(); app.UseSwaggerUi();在app.UseMvc();)之后

要在您的应用程序中启用日志记录,请查看: https://docs.asp.net/en/latest/fundamentals/logging.html?highlight=logging (日志将在“wwwroot”文件夹

中生成

答案 22 :(得分:-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%" ]
  }
}