Swashbuckle正在生成没有域类型信息的Swagger定义文件(缺少#/ definition / domain-type部分)

时间:2016-11-17 23:20:09

标签: c# swagger swashbuckle azure-api-apps autorest

当我发布我的Azure REST API应用程序时,它有奇怪的结果

1)获取" all"的方法记录按预期工作,生成如下:

public async Task<HttpOperationResponse<IList<DomainType>>> GetAllDomainObjectsWithOperationResponseAsync(...);

2)对于Get by idUpdateDeleteCreate方法,它是使用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文件?

Swagger definition file

编辑#2

目前的解决方案

在生成REST API客户端之前手动编辑生成的swagger定义文件

1 个答案:

答案 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响应代码相关联。