Swashbuckle / Swagger + ASP.Net核心:"无法加载API定义"

时间:2018-05-07 07:30:08

标签: c# asp.net-core swagger swashbuckle

我开发了一个ASP.NET Core 2应用程序并包含了Swagger。在我没有明确定义HTTP操作的情况下引入方法之前,一切正常:

public class ErrorController : Controller
{
    [Route("/error")]
    public IActionResult Index()
    {
        return StatusCode(500, new Error("Internal error."));
    }
}

当我使用此方法启动应用时,会显示以下消息:

  

无法加载API定义。

     

错误
  获取错误内部服务器错误/swagger/v1/swagger.json

一旦我明确设定,例如[HttpGet]错误消失了。这个问题是,我需要这个方法来触发所有可能的HTTP操作。 当然,我可以明确指定所有操作,但我觉得Swagger应该能够正确处理它。

为什么Swagger会这样做?

我可以使用任何配置吗?

21 个答案:

答案 0 :(得分:13)

为每个Action方法添加Httpxxx([HttpGet][HttpPost],...)属性,或为[ApiExplorerSettings(IgnoreApi = true)]

答案 1 :(得分:7)

只需在输出窗口中查看日志即可。在我的情况下可以看到实际的错误,我错过了在方法之上添加HTTP操作的情况

enter image description here

答案 2 :(得分:5)

我不知道这个问题是否已经解决,但是您可以通过以下方法装饰方法之一:

[ApiExplorerSettings(IgnoreApi = true)]

这将确保Swagger忽略所讨论的方法。

答案 3 :(得分:5)

选项ResolveConflictingActions应该适用于此案例......

以下是实际错误:

System.NotSupportedException: Ambiguous HTTP method for action

这是来自: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerGen/Generator/SwaggerGenerator.cs#L90

我认为这是一个错误,如果你真的感兴趣,你应该将它报告给项目

答案 4 :(得分:3)

如果有一些公共方法不是控制器中的动作,则Swagger也会抛出相同的异常。解决方法是使它们全部protectedprivate或如上所述添加属性[ApiExplorerSettings(IgnoreApi = true)]

答案 5 :(得分:3)

另一个可能的问题是,端点需要从域根目录完成。

我有:

app.UseSwaggerUI(c =>
{
     c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
});

我必须使用:

 app.UseSwaggerUI(c=>
{
     c.SwaggerEndpoint("/myApi/swagger/v1/swagger.json", "V1 Docs");

});

答案 6 :(得分:1)

在ASP.NET Core中,如果存在控制器端点,例如:

<Frame  Content="{Binding, Converter={cnv:MyConverter}}"  />

public class MyConverter
{
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dc = (value as DataContextType);
        if (dc != null)
        {
            if (dc.MyProperty == 1)
            {
                return new PageA() { DataContext = value };
            }
            return new PageB() { DataContext = value };
        }
        return Binding.DoNothing;
    }

    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
    ...
    }
}

这也可能因获取失败而失败。解决方案是拥有类似

的东西
[Route("images")]
[HttpGet("{id}")]

HttpPost也是如此。

答案 7 :(得分:1)

对我有用的是在控制器包装器中不是API调用的[NonAction]方法中添加public属性。

答案 8 :(得分:0)

对于核心 3,我遇到了同样的问题,我真的很困惑这个问题是在斜线中。

配置是:

services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "my-API", Version = "v1" });
            });

这个swagger端点抛出了TS的消息:

app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/v1/swagger.json", "my-API v1");
            });

最后我通过删除 URL 中的第一个斜杠来解决这个问题:

app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("v1/swagger.json", "my-API v1");
            });

答案 9 :(得分:0)

在启动文件中,您需要确保添加

services.AddSwaggerDocument();

在添加之前

app.UseOpenApi();
app.UseSwaggerUi3();

否则可能导致此错误

<块引用>

获取错误未定义/swagger/{documentName}/swagger.json

答案 10 :(得分:0)

如果您的模型(请求或响应)属性继承/实现了 System.ComponentModel(或其他类型)等类型,这将引发错误

"The JSON property 'item' is defined multiple times on type"...

尝试使用 [JsonIgnore]Newtonsoft.Json 属性忽略此属性

就我而言,我有一个 DataTable 类型的吸气剂

答案 11 :(得分:0)

我也遇到了这个问题。我检查并应用了 swagger 配置的所有解决方案,但问题仍然存在。 最后,我检查了输出面板,问题出在[DefaultValue("SYSDATETIMEOFFSET()")]

答案在这里:检查输出面板,你会找到答案

答案 12 :(得分:0)

导航到

,而不是盲目猜测可能是什么问题

http:///swagger/v1/swagger.json

enter image description here

就我而言,这可以通过使用 c.CustomSchemaIds(x => x.FullName);

这是一个可怕的解决方法,但对于有需要的人来说可能是快速的解决方法。我的解决方案是重命名并澄清这些端点的路径

答案 13 :(得分:0)

我有同样的问题。就我而言,我所有的控制器都是从 BaseController 继承的。在此基类中,我得到了一个公共操作,该操作根据Claims返回UserId。我在该操作的顶部设置了 [NonAction] 属性。

[ApiController]
[ApiResultFilter]
[Route("api/[controller]")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

public class BaseController : ControllerBase
{

    [NonAction]
    public int GetCurrentUserId()
    {
        return int.Parse(this.User.Claims.First(p => p.Type == ClaimTypes.NameIdentifier).Value);
    }
}

答案 14 :(得分:0)

就我而言,我使用此代码就像.net代码

MeshcatVisualizer.convert_to_video

现在我将其更改为可在网络核心网络api上使用

[ActionName("Login")]
[HttpPost]

它工作正常

答案 15 :(得分:0)

这是由于Newtonsoft.Json而引起的。但问题是我没有使用它。其中一个软件包可能取决于它,但是我没有时间检查。

所以只需检查输出panenl就可以解决相关问题。

答案 16 :(得分:0)

仔细检查,如果您在同一控制器中使用了相同的URL名称。我的代码发生了

答案 17 :(得分:0)

在此github问题中,除了Helder Sepulvedas的回答和“ Monte-Christos”的回答之外-Actions require unique method/path combination for Swagger

  

我找到了在ASP.NET中配置ResolveConflictingActions的地方   核心应用。在您的安装程序类中,将此添加到ConfigureServices()   方法:

services.AddSwaggerGen(c => 
  { 
    other configs...;
    c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
  });

这为我完成了把戏!

答案 18 :(得分:0)

我的错误原因是相同的网址名称,

\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000Z\u0012pÝ;%&Ý»\u0003Ú£QIFkf®´<Ì#tI=\u001fØï§;hÏ6³sy]³¯´ê×&á®\b!I¸¹\u0004\u000e¸ \u0018\u0004¥pËi\u0015vo\u0004Iåçãªä¥?Tÿ\u0000cª¥MäôHò1\u0012ê¹K¾ßC¦3ÛÔjóà \u0001èr\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000%&ÝàLbäìºT­¤Ußv(Ò·¥jÞìëcN'\\ç·ªªj\nï~KBwºà¤Åõ3x¦ueðéF´z£TÔ-Ú&2»Iny5ñë/DÜ®£+3U$¿ô«á\u001c¼-|¬(ê¾\u0011W94Ûz#XÖS\^?á¦å¹Léí©)\\ëßh×É'¥*G>æ©OåÐÛ3ÎÚ4iTëIÇÞÞ¼ªÜ\u001fÌ¡ßRñÇ\u0014àá+25*^ª\u0000%@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001ÓBg»ØÆsÍ.ÝÎú\u0010¼¯Ù\u0017úV´à¡\u001b½ûÌËT¶(t\tÙÜMck]]\u0018I¼÷]¶/\tÚéìRÆq½z\u0010J¥5$·C¤¸E0\u0012º7ÛTuå8k>]eðçT\bÇ\u001aòRP[ÈïÊyÙfÄ5Ú:\u0015å¾\u0019Qzå5Ë\u000f,Æ\u001e&Låß±×jò» \u0000ÒITÉVdâ÷[\u001d\u0010»1Z:f^æ5æ=\u001d\u0006ØYæ]÷19Yʹz\u0000\fh\u0000\u0000\u0000\u0000\u0000\u0003£\u000f\u001d\u001c½ø,×û9(GÑ\u0015É×SHg§;í@@-)\u0004\u0012\u0004\u0000\u001bagÓÄAönÌõ\fõéO=(ËsÜý^ZJJ1mìÏ\u0016RrÝ».ypòó¡æ\f\u001a\b\u0000´\u0004\u0012@hk\u00176fE©¿U¹\u0014aV\u0017¢q\u001eei_Ϩ²ÎKÉÏ\^?êò¨\u0000\u0000\u0000\u0000\u0000\u0000\u0000;¨mOØ該9hKÑ\u0017Á×SX£f@l#X\u0000

我使用相同的网址,大摇大摆无法获取它们

 [HttpGet("get/LeaveCommand/{id}")]

答案 19 :(得分:0)

我也收到此错误,因为我创建了一个控制器,该控制器具有[Route("api/[controller]")]。放好之后,错误消失了。

答案 20 :(得分:0)

我在正在删除的未使用的类上得到TypeLoadException。我的解决方法是删除bin / obj / Debug文件夹中的内容。干净的解决方案+重建解决方案无法解决我的问题。