- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Swashbuckle(一个围绕 swagger 的 .NET 包装器)。
当我生成 swagger 文档时,它会根据 Controller 名称/参数生成文档中的 URI,而不是在应用程序启动时在配置中定义的已定义路由。
所以我有一个 Controller :
namespace Pat.PostingService.Api.Version1
{
public class DeliveryStatusController : ApiController
{
[ResponseType(typeof(DeliveryStatusDto))]
public dynamic Get(string deliveryType, Guid? orderId = null)
{
...
}
}
{
在 RouteConfig.cs 文件中,我重新定义了路由:
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
...
config.Routes.MapHttpRoute(
name: "DeliveryStatusService",
routeTemplate: "SpecialDeliveryServiceStatus/{deliveryType}/{orderId}",
defaults: new {
controller = "DeliveryStatus",
orderId = RouteParameter.Optional
}
);
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
调用 API 时,我现在不能使用 /DeliveryStatus
端点,我必须使用 /SpecialDeliveryServiceStatus
端点。
但是,Swagger 文档指出端点是 /DeliveryStatus
。
与我的同事一起,我们相信 _apiExplorer.ApiDescriptions
(来自 Swashbuckle.Core 中 SwaggerGenerator.cs 使用的 System.Web.Http.Description.IApiExplorer)返回给我们错误的路线,尽管我们可能错了。
我们错过了什么?我们可以使用什么来确保 Swagger 使用配置中使用的路由而不是默认路由?
编辑:
我们还使用 SDammann 进行版本控制(想象 version2 文件夹中的第二个 RouteConfig.cs 文件),它不支持 [AttributeRouting],因此我们需要从启动路由配置中获取路由。
编辑 2:
将 action = "Get"
放入路由的默认值中也不能解决问题。
最佳答案
当第一场比赛获胜时,您注册/映射路线的顺序在路线表中起着重要作用。您的示例显示了您如何注册有问题的路线,但没有显示它相对于其他路线的注册位置。
例如,如果您在相关路由之前注册默认路由
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
...
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DeliveryStatusService",
routeTemplate: "SpecialDeliveryServiceStatus/{deliveryType}/{orderId}",
defaults: new {
controller = "DeliveryStatus",
orderId = RouteParameter.Optional
}
);
}
...然后 GET/DeliveryStatus
将按照约定匹配
public dynamic Get(string deliveryType, Guid? orderId = null) { ... }
特别是如果 id
占位符是可选的。
因此请检查以确保您的路由映射顺序正确。默认路由通常最后映射为回退路由。
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
...
config.Routes.MapHttpRoute(
name: "DeliveryStatusService",
routeTemplate: "SpecialDeliveryServiceStatus/{deliveryType}/{orderId}",
defaults: new {
controller = "DeliveryStatus",
orderId = RouteParameter.Optional
}
);
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
如果你不反对使用attribute routing in web api 2 ,你可以改为...
namespace Pat.PostingService.Api.Version1
{
[RoutePrefix("SpecialDeliveryServiceStatus")]
public class DeliveryStatusController : ApiController
{
//GET SpecialDeliveryServiceStatus/{deliveryType}/{orderId}
[HttpGet]
[Route("{deliveryType}/{orderId?}")]
[ResponseType(typeof(DeliveryStatusDto))]
public dynamic Get(string deliveryType, Guid? orderId = null) { ... }
}
}
并在RouteConfig.cs文件中,配置属性路由:
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
...
}
映射的顺序很重要,这就是为什么它通常在其他映射之前配置。
尝试以下操作:
config.Routes.MapHttpRoute(
name: "DeliveryStatusService",
routeTemplate: "SpecialDeliveryServiceStatus/{deliveryType}/{orderId}",
defaults: new {
controller = "DeliveryStatus",
action = "Get"
orderId = RouteParameter.Optional
}
);
在 Controller 中:
[HttpGet]
[ResponseType(typeof(DeliveryStatusDto))]
public dynamic Get(string deliveryType, Guid? orderId = null) { ... }
确保路由表不会猜测操作映射到哪条路由。
关于c# - Swashbuckle/Swagger 没有从配置中获取路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965970/
我将 Swashbuckle.AspNetCore NuGet 添加到我的项目中,它似乎运行良好。 (我得到 Swagger 页面就好了。) 但是当我处理另一个问题(不使用 Swagger 页面)时,
.Netcore 2.2虚张声势 4.0.1 Swagger UI 在本地主机上运行,但在部署到 Azure ASE 到由应用程序网关管理的站点后,Swagger 将不会加载。 (已确认生成 sw
这是我的理解: Swagger 是一种编写文档的符号/规则。但为什么它被称为框架(如 Angular/MVC)? Swashbuckle 是一个生成文档(基于 Swagger 规则)的程序(JavaS
使用 ABP 框架 (3.3) 和 ASP.NET Core (3.1)。 在编译应用程序后,我尝试使用 Swashbuckle.AspNetCore.Cli ( https://github.com
如何在 Swashbuckle 6.0.0 的选项中禁用 Swagger Schema 验证器。我知道它在本地运行时默认关闭,但没有看到 SwaggerUI() 的 validatorURL 选项 最
我在隐藏调用时遇到 Swashbuckle 问题,链接到调用的模型定义保留在生成的 JSON 中的定义中。 使用文档过滤器,我可以从界面中删除调用。 调用保留在生成的 JSON 中,但在 Swagge
我使用 Swashbuckle 将 Swagger 文档添加到我的 ASP.NET Web API 项目中。如何在不注入(inject) CSS 的情况下从文档页面隐藏默认标题(带有 swagger
在 Swashbuckle 中,有一个名为 OrderActionGroupsBy 的设置,它应该更改 API 内的排序,但我所做的一切都不起作用,而且我无法确定这是否是 Swashbuckle 问题
我的应用程序是一个 ASP.NET Core 1.0 Web API。 我有以下 Controller : [HttpGet("{someData:MinLength(5):MaxLength
我正在尝试为 swashbuckle 注册自定义路由。但是我想不通。 我需要做的是为当前路由添加一个扩展。 举个例子:我需要将它设置为 swagger.aspx/ui 而不是 swagger/ui .
我有一个包含 90 多个表的数据库,这些表都通过外键相互交叉链接。 当我打开我的 API 的 swagger 页面时,加载需要 2 多分钟。原因似乎是它正在为每个 API 生成 Model 和 Exa
我正在使用 Swashbuckle v3.0。 我不确定这是否是一个错误,但多态性并没有像它应该的那样工作。我有以下类(class): BasePersonDocumentDto { Id,
在 ASP.NET Core webapp 中使用 Swashbuckle.AspNetCore,我们有如下响应类型: public class DateRange { [JsonConver
我正在使用 SwaggerResponse 属性来装饰我的 api Controller 操作,这一切工作正常,但是当我查看生成的文档时,参数的描述字段是空的。 是否有基于属性的方法来描述操作参数(而
我有一个 C# 对象 public class MyObject { public int property1 { get; set; } public string property2 { ge
我应该如何在 .net 核心中设置 swashbuckle 以便我可以从请求正文上传文件(多部分,表单值模型绑定(bind)已禁用)? 我尝试了什么(显然在 swashbuckle 启动配置中添加了
我从 Swashbuckle 开始,我使用 Swashbuckle 在 .NET Core 中创建了一个 Web API。 我需要在 IIS 站点的子应用程序中部署我的 API IIS 基础设施 II
是否可以在 asp.net Core 2.0 Web API 上的 Swashbuckle UI 上设置默认选中的身份验证范围复选框? 我使用“openid”范围,我希望每次都检查它。 谢谢你。 最佳
我们在代码中使用 JetBrains 注释来定义对象模型的可空性行为。默认情况下,我无法在使用 Swashbuckle.AspNetCore v5.0.0-rc5 实现的 Swagger UI 中看到
我们在代码中使用 JetBrains 注释来定义对象模型的可空性行为。默认情况下,我无法在使用 Swashbuckle.AspNetCore v5.0.0-rc5 实现的 Swagger UI 中看到
我是一名优秀的程序员,十分优秀!