4

我已经在我的 Web API 应用程序上成功实现了 Swashbuckle/Swagger,但对输出不满意。

我的一种 web api 方法(企业事件记录工具)接受复杂对象值的 JSON 对象。

问题是,当存在可以使用的可接受值的选定列表时,参数被列为字符串对象。我已经设置了默认值,因此如果发送了不正确的内容,我设置为默认值。

我想我可以添加其他返回可接受值的服务调用,但我宁愿不这样做。

我确实在 Swashbuckle 上实现了模式部分来设置一个有效的“示例”对象,但它只列出了可能一百种不同组合中的一种。

我可以给出的问题的最佳示例如下:

EnterpriseEvent {
   EventType (string, optional),
   SourceSystem (string, optional),
   Company (string, optional),
   Interface (string, optional),
   TransactionType (string, optional),
   EventDateTime (string, optional),
   EventXML (Array[Object], optional),
   Operation (string, optional),
   LoggingLevel (string, optional)
}

SourceSystem 可接受的值类似于“Accounting”或“Payments”或“Portal”。而公司的可接受值可能是“子公司 1”或“合作伙伴 1”。

有什么我可以添加到 Swashbuckle/Swagger 以将其输出到某处的吗?

4

1 回答 1

6

最简单的解决方案是将属性从字符串类型更改为枚举,例如:

// original    
public class EnterpriseEvent {
   public string SourceSystem { get; set; }
}

// change
 public class EnterpriseEvent {
   public SourceSystemType SourceSystem { get; set; }
}
public enum SourceSystemType {  
   Accounting,
   Payments
}   

然而,带空格的枚举很痛苦。有一个标准的 .NET 机制来处理这些(用EnumMember属性装饰枚举成员),但是 swashbuckle 没有考虑到这一点。

[DataContract]
public enum CompanyType
{
    [EnumMember(Value = "Partner 1")]
    Partner1,
    [EnumMember(Value = "Sub Company 1")]
    SubCompany1
}

https://github.com/domaindrivendev/Swashbuckle/pull/563/files

因此,您可以获得修改版的 swashbuckle(带有上述修复)。或者,如果您不想自定义 swashbuckle 构建(我可以与之相关),您可以保留模型原样并实现您的“自己的”模式提供程序,如下所示:

GlobalConfiguration.Configuration 
  .EnableSwagger(c =>
  {
    c.CustomProvider((defaultProvider) => new CustomSwaggerProvider(defaultProvider));
  });       

public class CustomSwaggerProvider: ISwaggerProvider
{
  private readonly ISwaggerProvider m_DefaultProvider;
  public CustomSwaggerProvider(ISwaggerProvider defaultProvider)
  {
    m_DefaultProvider = defaultProvider;
  }

  public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
  {
    // grab the default schema
    var result = m_DefaultProvider.GetSwagger(rootUrl, apiVersion);
    // adjust
    result.definitions["EnterpriseEvent"]
     .properties["SourceSystem"]
     .@enum = new string[] { "Enum with space 1", "Enum with space 2" };

    return result;
  }
}

编辑

如果我理解您的评论,您没有在 web api 中配置字符串作为枚举。这是快速操作方法:

protected void Application_Start() {
  GlobalConfiguration.Configure((config) => {
    config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(
      new Newtonsoft.Json.Converters.StringEnumConverter());
  });
}
于 2015-12-18T10:21:24.580 回答