无法使用多个 HttpPut 命令生成 swagger
Cannot generate swagger with multiple HttpPut commands
当我有多个 HttpPut 命令时,我无法让 swashbuckle 生成 swagger.json。我正在使用 OData4 和 ASP.NET Core 2.2。如果我评论两种 HttpPut 方法中的任何一种,它都会生成很好的结果。我尝试添加 [SwaggerOperation(OperationId = '')] 属性,但没有成功。我尝试添加 [ODataRoute(nameof())] 属性但没有成功。我曾尝试编辑 [HttpPut(nameof())] 属性,但没有成功。我无能为力,试图找出使它起作用的组合键。热切欢迎任何建议。
[ApiVersion("1.0")]
[ODataRoutePrefix("Items")]
public class ItemsController : ODataController {
[HttpGet]
[Produces("application/json")]
[ProducesResponseType(typeof(IQueryable<Item>), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
[EnableQuery(AllowedQueryOptions = Select | OrderBy | Top | Skip | Count,
AllowedFunctions = AllowedFunctions.None,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedLogicalOperators = AllowedLogicalOperators.None,
AllowedOrderByProperties = "name,location",
MaxOrderByNodeCount = 2,
MaxTop = 100)]
public async Task<IActionResult> Get() {
...
}
[HttpGet]
[ODataRoute("({key})")]
[ProducesResponseType(typeof(Item), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetById(string key) {
...
}
[HttpPost]
[ODataRoute]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> Post([FromBody] AddItemCommand command) {
...
}
[HttpPut]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> StopMonitoring([FromBody] StopMonitoringCommand command) {
...
}
[HttpPut]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> ChangeMonitoring([FromBody] ChangeMonitoringCommand command) {
...
}
}
其中的两个 HttpPut 方法都失败并显示 "Fetch error undefined /swagger/v1/swagger.json" 错误消息。
@HelderSepulveda 和 Actions and Functions in OData v4 Using ASP.NET Web API 2.2 给了我解决这个问题的线索。
无论在控制器上是HttpPut
还是HttpPost
,都可以通过将它们添加到控制器和OData模型配置来添加动作。
例如
public class ODataModelConfiguration : IModelConfiguration {
public void Apply(ODataModelBuilder builder, ApiVersion apiVersion) {
builder.EntitySet<Item>("Items");
builder.EntityType<Item>()
.Action("StopMonitoring")
.Parameter<StopMonitoringCommand>("command");
builder.EntityType<Item>()
.Action("ChangeMonitoring")
.Parameter<ChangeMonitoringCommand>("command");
}
}
在控制器中:
[HttpPut]
[ODataRoute("StopMonitoring")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> StopMonitoring([FromBody] StopMonitoringCommand command) {
...
}
[HttpPut]
[ODataRoute("ChangeMonitoring")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> ChangeMonitoring([FromBody] ChangeMonitoringCommand command) {
...
}
结合原来的post中的代码,大摇大摆地生成如下:
GET /api/Items
POST /api/Items
GET /api/items({key})
PUT /api/items/StopMonitoring
PUT /api/items/ChangeMonitoring
当我有多个 HttpPut 命令时,我无法让 swashbuckle 生成 swagger.json。我正在使用 OData4 和 ASP.NET Core 2.2。如果我评论两种 HttpPut 方法中的任何一种,它都会生成很好的结果。我尝试添加 [SwaggerOperation(OperationId = '')] 属性,但没有成功。我尝试添加 [ODataRoute(nameof())] 属性但没有成功。我曾尝试编辑 [HttpPut(nameof())] 属性,但没有成功。我无能为力,试图找出使它起作用的组合键。热切欢迎任何建议。
[ApiVersion("1.0")]
[ODataRoutePrefix("Items")]
public class ItemsController : ODataController {
[HttpGet]
[Produces("application/json")]
[ProducesResponseType(typeof(IQueryable<Item>), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
[EnableQuery(AllowedQueryOptions = Select | OrderBy | Top | Skip | Count,
AllowedFunctions = AllowedFunctions.None,
AllowedArithmeticOperators = AllowedArithmeticOperators.None,
AllowedLogicalOperators = AllowedLogicalOperators.None,
AllowedOrderByProperties = "name,location",
MaxOrderByNodeCount = 2,
MaxTop = 100)]
public async Task<IActionResult> Get() {
...
}
[HttpGet]
[ODataRoute("({key})")]
[ProducesResponseType(typeof(Item), (int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetById(string key) {
...
}
[HttpPost]
[ODataRoute]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> Post([FromBody] AddItemCommand command) {
...
}
[HttpPut]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> StopMonitoring([FromBody] StopMonitoringCommand command) {
...
}
[HttpPut]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> ChangeMonitoring([FromBody] ChangeMonitoringCommand command) {
...
}
}
其中的两个 HttpPut 方法都失败并显示 "Fetch error undefined /swagger/v1/swagger.json" 错误消息。
@HelderSepulveda 和 Actions and Functions in OData v4 Using ASP.NET Web API 2.2 给了我解决这个问题的线索。
无论在控制器上是HttpPut
还是HttpPost
,都可以通过将它们添加到控制器和OData模型配置来添加动作。
例如
public class ODataModelConfiguration : IModelConfiguration {
public void Apply(ODataModelBuilder builder, ApiVersion apiVersion) {
builder.EntitySet<Item>("Items");
builder.EntityType<Item>()
.Action("StopMonitoring")
.Parameter<StopMonitoringCommand>("command");
builder.EntityType<Item>()
.Action("ChangeMonitoring")
.Parameter<ChangeMonitoringCommand>("command");
}
}
在控制器中:
[HttpPut]
[ODataRoute("StopMonitoring")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> StopMonitoring([FromBody] StopMonitoringCommand command) {
...
}
[HttpPut]
[ODataRoute("ChangeMonitoring")]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest)]
public async Task<IActionResult> ChangeMonitoring([FromBody] ChangeMonitoringCommand command) {
...
}
结合原来的post中的代码,大摇大摆地生成如下:
GET /api/Items
POST /api/Items
GET /api/items({key})
PUT /api/items/StopMonitoring
PUT /api/items/ChangeMonitoring