我开发了一个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会这样做?
我可以使用任何配置吗?
答案 0 :(得分:13)
为每个Action方法添加Httpxxx([HttpGet]
,[HttpPost]
,...)属性,或为[ApiExplorerSettings(IgnoreApi = true)]
答案 1 :(得分:7)
答案 2 :(得分:5)
我不知道这个问题是否已经解决,但是您可以通过以下方法装饰方法之一:
[ApiExplorerSettings(IgnoreApi = true)]
这将确保Swagger忽略所讨论的方法。
答案 3 :(得分:5)
选项ResolveConflictingActions应该适用于此案例......
以下是实际错误:
System.NotSupportedException: Ambiguous HTTP method for action
我认为这是一个错误,如果你真的感兴趣,你应该将它报告给项目
答案 4 :(得分:3)
如果有一些公共方法不是控制器中的动作,则Swagger也会抛出相同的异常。解决方法是使它们全部protected
或private
或如上所述添加属性[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
就我而言,这可以通过使用 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文件夹中的内容。干净的解决方案+重建解决方案无法解决我的问题。