相关疑难解决方法(0)

静态方法更有效吗?

在内存和时间方面,使方法静态更好吗?

c# performance static-methods

46
推荐指数
4
解决办法
1万
查看次数

在Web API中传递枚举参数的最佳实践

我有一个RESTful Web API项目,我有2个不同的Enum场景,我不确定是最佳实践.

场景1:直截了当的Enum Param

我的API方法需要一个名为的参数ruleType,其有效值为EmailAddressIPAddress.我在Web API项目中的枚举如下所示:

public enum RuleType
{
    None = 0,
    EmailAddress = 1,
    IPAddress = 2
}
Run Code Online (Sandbox Code Playgroud)

我对这个场景的问题是,我应该?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.
}
Run Code Online (Sandbox Code Playgroud)

这里最好的做法是什么?我正在查看按位枚举,因此在API请求中发送了一个值,这导致了任何组合,fields但不知道这是否适用于Web API,或者通常是否有更好的方法来解决这个问题?

c# rest enums asp.net-web-api

21
推荐指数
3
解决办法
4万
查看次数

Swagger C# 枚举生成 - 底层 int 值与原始枚举不匹配

我在服务器上创建了一个枚举,其中手动设置了整数值,而不是从 0 开始默认增量

public enum UserType
{
    Anonymous = 0,
    Customer = 10,
    Technician = 21,
    Manager = 25,
    Primary = 30
}
Run Code Online (Sandbox Code Playgroud)

我的服务器正在使用 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, …
Run Code Online (Sandbox Code Playgroud)

c# swagger asp.net-core swagger-codegen nswagstudio

13
推荐指数
2
解决办法
1万
查看次数

在Asp.net Core中使用Swagger进行流畅验证

我目前正在使用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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

fluentvalidation swagger asp.net-core

11
推荐指数
3
解决办法
4727
查看次数

SwaggerUI 不显示枚举摘要描述,C# .net 核心?

我使用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();
});
Run Code Online (Sandbox Code Playgroud)

我的enum

public enum GenderEnum
{
    /// <summary>
    /// Man Description
    /// </summary>
    Man = 1,

    /// <summary>
    /// Woman Description
    /// </summary>
    Woman = 2
}
Run Code Online (Sandbox Code Playgroud)

它显示如下内容:
Swagger UI 枚举

我想像 这样在 SwaggerUI 中显示Man Description和显示:Woman Description

Man = 1, Man Description
Woman = 2,  Woman Description …
Run Code Online (Sandbox Code Playgroud)

c# enums swagger-ui .net-core asp.net-core-webapi

9
推荐指数
3
解决办法
9093
查看次数

C#NSwag和带有Enums的swagger-codegen

我有一个.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
}
Run Code Online (Sandbox Code Playgroud)

生成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
   ]
},
Run Code Online (Sandbox Code Playgroud)

当在JSON上运行swagger codegen时,我在IO.Swagger项目中为C#获得了以下LoginResult模型(选择了targetFramework 5.0)-

[JsonConverter(typeof(StringEnumConverter))]

public enum LoginResult
{

    /// <summary>
    /// Enum _0 …
Run Code Online (Sandbox Code Playgroud)

c# swagger swagger-codegen asp.net-core-webapi nswag

6
推荐指数
2
解决办法
1841
查看次数

在 Swagger 下拉列表和 json 上显示 Enum 成员友好名称

我试图让枚举以大肆展示和响应时的描述(或任何其他属性)中的友好名称。还尝试解析控制器操作中主体/查询字符串上设置的友好名称,而不尝试 400 BadRequest 或任何类型的验证错误。我还注意到,我拥有的自定义通用 JsonConverter 也无法正常工作。该ReadJson()方法根本没有被调用。我怎样才能让它发挥作用?

[JsonConverter(typeof(JsonEnumConverter<SortDirectionType>))]
public enum SortDirectionType
{
    [Description("asc")]
    ASCENDING,
    [Description("desc")]
    DESCENDING
}
Run Code Online (Sandbox Code Playgroud)

我试图让 swagger-ui 将 asc 和 desc 显示为下拉列表中的值,而不是升序和降序。这意味着我无法使用c.DescribeAllEnumsAsStrings(). 如果我不使用它,那么下拉列表将显示 0,1,因为它应该代表枚举成员值。现在我可以使用[EnumMember(Value="asc"]属性而不是[Description("asc")]属性。然而接下来发生了两件事:

  1. swagger-ui 抛出客户端验证并突出显示周围有红线的字段
  2. 或者,如果我尝试在 swagger 之外调用端点,它会返回 400 错误。
  3. 我能够在操作[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 …
Run Code Online (Sandbox Code Playgroud)

c# enums model-binding asp.net-core

6
推荐指数
1
解决办法
2万
查看次数