我有一个RESTful Web API项目,我有2个不同的Enum场景,我不确定是最佳实践.
场景1:直截了当的Enum Param
我的API方法需要一个名为的参数ruleType,其有效值为EmailAddress和IPAddress.我在Web API项目中的枚举如下所示:
public enum RuleType
{
    None = 0,
    EmailAddress = 1,
    IPAddress = 2
}
我对这个场景的问题是,我应该?ruleType=EmailAddress在我的API请求中使用它(它会自动将该值绑定到RuleTypeAPI方法中的属性)吗?如果是这样,如何最好地验证RuleTypeparam发送的是一个有效的RuleType Enum值?
场景2:单个参数的多个枚举值
我的API方法有一个可选的fieldsparam,它允许您指定应返回的任何其他数据.例如&fields=ruleOwner,rule.这将在响应中返回那2个额外的数据位.
我在Web API项目中有一个枚举,它与field可能请求的每个可能相关,目前,我正在拆分逗号分隔的字段param,然后循环遍历该枚举的每个字符串表示,将其解析为等效的枚举,结果在Enum值列表中,然后我可以在我的API中使用它来检索相关数据.
这是Enum:
public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    etc.
}
这里最好的做法是什么?我正在查看按位枚举,因此在API请求中发送了一个值,这导致了任何组合,fields但不知道这是否适用于Web API,或者通常是否有更好的方法来解决这个问题?
我在服务器上创建了一个枚举,其中手动设置了整数值,而不是从 0 开始默认增量
public enum UserType
{
    Anonymous = 0,
    Customer = 10,
    Technician = 21,
    Manager = 25,
    Primary = 30
}
我的服务器正在使用 AspNetCore.App 2.2.0 运行。它在 Startup.cs 中使用 swashbuckle aspnetcore 4.0.1 进行配置,以在每次服务器启动时生成一个 swagger json 文件来描述 api。
然后,我使用 NSwag Studio for windows v 13.2.3.0 生成带有该 swagger JSON 文件的 C Sharp api 客户端,以在 Xamarin 应用程序中使用。生成的 c Sharp api 客户端中生成的枚举如下所示 - 底层整数值与原始枚举不匹配。
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")]
public enum UserType
{
    [System.Runtime.Serialization.EnumMember(Value = @"Anonymous")]
    Anonymous = 0,
    [System.Runtime.Serialization.EnumMember(Value = @"Customer")]
    Customer = 1, …我目前正在使用Fluent Validation而不是使用Data Annotations我的Web API并使用swagger来获取API文档.流畅的验证规则没有反映在swagger模型中,因为我无法使用swagger模式过滤器配置流畅的验证规则.
本博客对ASP.net MVC使用它有很好的解释.但我无法配置它在ASP.net Core中使用它.
到目前为止,我已经尝试了以下代码,但我无法获得验证器类型.
services.AddSwaggerGen(options => options.SchemaFilter<AddFluentValidationRules>());
public class AddFluentValidationRules : ISchemaFilter
{
    public void Apply(Schema model, SchemaFilterContext context)
    {
        model.Required = new List<string>();
        var validator = GetValidator(type); // How?
        var validatorDescriptor = validator.CreateDescriptor();
        foreach (var key in model.Properties.Keys)
        {
            foreach (var propertyValidator in validatorDescriptor.GetValidatorsForMember(key))
            {
                 // Add to model properties as in blog
            }
        }
    }
}
我使用https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-2.1&tabs=visual-studio#xml-comments来显示我的课程摘要说明在 SwaggerUI 中,可以但不显示enum摘要描述!
我的startup.cs
services.AddSwaggerGen(c =>
{   
    c.SwaggerDoc("v1", new Info
    {
        Version = "v1",
        Title = "My App-Service",
        Description = "My Description",
    });
    c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"));  
    c.DescribeAllEnumsAsStrings();
});
我的enum:
public enum GenderEnum
{
    /// <summary>
    /// Man Description
    /// </summary>
    Man = 1,
    /// <summary>
    /// Woman Description
    /// </summary>
    Woman = 2
}
我想像
这样在 SwaggerUI 中显示Man Description和显示:Woman Description
Man = 1, Man Description
Woman = 2,  Woman Description …我有一个.Net Core v2.1 Web API,它使用NSwag生成其Swagger Json。
我有一个这样的响应模型-
public class LoginResponse
{
    public LoginResult LoginResult { get; set; }
}
public enum LoginResult
{
    AwaitingEmailConfirmation = 0,
    Locked = 1,
    Failed = 2,
    Success = 3
}
生成Swagger JSON的-
"definitions":{  
"LoginResponse":{  
   "type":"object",
   "additionalProperties":false,
   "required":[  
      "loginResult"
   ],
   "properties":{  
      "loginResult":{  
         "$ref":"#/definitions/LoginResult"
      }
   }
},
"LoginResult":{  
   "type":"integer",
   "description":"",
   "x-enumNames":[  
      "AwaitingEmailConfirmation",
      "Locked",
      "Failed",
      "Success"
   ],
   "enum":[  
      0,
      1,
      2,
      3
   ]
},
当在JSON上运行swagger codegen时,我在IO.Swagger项目中为C#获得了以下LoginResult模型(选择了targetFramework 5.0)-
[JsonConverter(typeof(StringEnumConverter))]
public enum LoginResult
{
    /// <summary>
    /// Enum _0 …我试图让枚举以大肆展示和响应时的描述(或任何其他属性)中的友好名称。还尝试解析控制器操作中主体/查询字符串上设置的友好名称,而不尝试 400 BadRequest 或任何类型的验证错误。我还注意到,我拥有的自定义通用 JsonConverter 也无法正常工作。该ReadJson()方法根本没有被调用。我怎样才能让它发挥作用?
[JsonConverter(typeof(JsonEnumConverter<SortDirectionType>))]
public enum SortDirectionType
{
    [Description("asc")]
    ASCENDING,
    [Description("desc")]
    DESCENDING
}
我试图让 swagger-ui 将 asc 和 desc 显示为下拉列表中的值,而不是升序和降序。这意味着我无法使用c.DescribeAllEnumsAsStrings(). 如果我不使用它,那么下拉列表将显示 0,1,因为它应该代表枚举成员值。现在我可以使用[EnumMember(Value="asc"]属性而不是[Description("asc")]属性。然而接下来发生了两件事:
[FromBody]参数中成功使用 0,1 或 ASCENDING、DESCENDING 值。然而,这并不是我们所期望的。我将接收 asc、desc 并希望能够在主体模型上成功解析它并将其映射到枚举属性。另一方面,当 json 呈现时,它应该呈现友好的名称。附加代码:
public class JsonEnumConverter<T> : JsonConverter where T : struct, IComparable, IConvertible, IFormattable
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }
    public override object ReadJson(JsonReader …c# ×6
asp.net-core ×3
enums ×3
swagger ×3
.net-core ×1
nswag ×1
nswagstudio ×1
performance ×1
rest ×1
swagger-ui ×1