无法使用多个HttpPut命令生成摇摇欲坠

时间:2019-08-21 14:44:40

标签: odata asp.net-core-webapi swagger-ui swashbuckle

当我有多个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”错误消息。

1 个答案:

答案 0 :(得分:0)

@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) {
    ...
}

结合原始帖子中的代码,这会大张旗鼓地产生以下内容:

GET  /api/Items
POST /api/Items
GET  /api/items({key})
PUT  /api/items/StopMonitoring
PUT  /api/items/ChangeMonitoring