当我发布我的Azure REST API应用程序时,它有奇怪的结果
1)获取" all"的方法记录按预期工作,生成如下:
public async Task<HttpOperationResponse<IList<DomainType>>> GetAllDomainObjectsWithOperationResponseAsync(...);
2)对于Get by id
,Update
,Delete
和Create
方法,它是使用object
而不是域对象生成的
async Task<HttpOperationResponse<object>> DeleteDomainObjectByIdWithOperationResponseAsync(..)
因此,当我使用此Delete,Update,Create和GetById方法时,服务无法正常工作。如果我手动将object
替换为相应的域类型,它正在按预期工作,但在每次服务发布后,将重新创建错误的代码......
我已经尝试过一些来自SwaggerConfig.cs的东西(例如启用IncludeParameterNamesInOperationIdFilter
),但在这种情况下似乎没什么帮助。
有关导致此问题的原因以及如何处理该问题的任何想法?
P.S。我注意到一些更令人不快的行为 - 比如DateTime
生成DateTimeOffset?
而byte
生成byte[]
,但我可以忍受这种行为。我不想定期打架的是通过所有生成的代码将object
类型更改为适当的域类型 - 在这种情况下编译器无法帮助...
修改
根据@olydis的评论,结果表明生成的swagger定义文件缺少$ref, "#/definition/domain-type"
形式的返回类型定义。
在MVA course Mastering Azure App Service(模块4.演示集成发现3:33左右)是生成的swagger定义文件的可见示例,并且存在这些类型定义。 什么可能导致Swashbuckle不生成此信息?我有一个最新的Swashbuckle版本5.x.x.是否存在域类型必须满足的先决条件才能使Swashbuckle正确生成Swagger文件?
编辑#2
目前的解决方案
在生成REST API客户端之前手动编辑生成的swagger定义文件
答案 0 :(得分:0)
您可以提供关于如何制定Swagger JSON文件的Swashbuckle提示(fwiw - 现在有些人将swagger doc称为Open API文档)。
当我不得不对我的Web API进行新的编辑时,这使我不必重新调整生成的代码
using Swashbuckle.Swagger.Annotations;
namespace MyCorp.WebApi.Controllers
{
[Authorize]
public class CrazyObjectController : ODataController
{
private MyDbModel db = new MyDbModel();
[SwaggerResponse(HttpStatusCode.Created, Type = typeof(CrazyObject))]
[SwaggerResponse(HttpStatusCode.BadRequest, Description = "Invalid Request")]
[Authorize(Roles = "AdminAccess")]
public async Task<IHttpActionResult> Post(CrazyObject crazObj)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.CrazyObjects.Add(crazObj);
await db.SaveChangesAsync();
return Created(crazObj);
}
}
}
在上面的块中,使用属性行实现魔术:
[SwaggerResponse(HttpStatusCode.Created, Type = typeof(CrazyObject))]
将此Type
与201响应代码相关联。