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