无法使用多个 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