【问题标题】:Return error msg in payload when header not present当标头不存在时,在有效负载中返回错误消息
【发布时间】:2020-02-12 16:29:25
【问题描述】:

我有这个动作方法:

[HttpGet]
public virtual async Task<IActionResult> GetModifiedSince([HeaderCompanyId] Guid? xCompanyId)
{
...
}

上述action方法中的HeaderCompanyId类在这里定义:

public class HeaderCompanyIdAttribute : FromHeaderAttribute
{
    public HeaderCompanyIdAttribute()
    {
        Name = "x-company-id";
    }
}

我正在使用这个IOperationFilter 来使xCompanyId 成为必需:

public class AddSwaggerToStandardHeadersFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        var companyIdHeader = operation.Parameters.FirstOrDefault(x => x.Name == "x-company-id");
        if (companyIdHeader != null)
        {
            companyIdHeader.Description = "Company id";
            companyIdHeader.Required = true;
        }
    }
}

这是我添加OperationFilter的地方:

public static IServiceCollection RegisterSwagger(this IServiceCollection services) =>
    services.AddSwaggerGen(setupAction =>
    {
        ...
        setupAction.OperationFilter<AddSwaggerToStandardHeadersFilter>();
    }
}

我可以在 Swagger UI 中看到标为必填的标题。 但是,当我到达端点时,xCompanyId ModelState.IsValid = true 没有任何值,并且我没有收到关于需要标头的错误消息。

如何返回 4XX 来表示需要 xCompanyId 标头? 理想情况下,如果我在 action 方法中设置断点,它甚至不应该被命中。

【问题讨论】:

  • 您的所有请求中是否需要此 xCompanyId 或只是您的应用程序中的某些操作?
  • 所有请求都需要。
  • @DavidKlempfner 确实找到了解决方案?

标签: c# http asp.net-core asp.net-core-2.1


【解决方案1】:

另外,您可以尝试使用模型而不是“Guid”参数

[HttpGet]
public virtual async Task<IActionResult> GetModifiedSince([FromHeader]YourCustomHeader headers)
{
 ...
}

使用您的自定义模型

public class YourCustomHeader
{
    [Required]
    public string xCompanyId { get; set; }
}

【讨论】:

    【解决方案2】:

    在 API 方法中做一个简单的检查怎么样:

     if (xCompanyId == null)
      return BadRequest("CompanyId is mandatory");
    

    【讨论】:

    • 我宁愿保持干燥,因为它是所有操作方法所必需的。我想可能有一些我可以使用的属性。
    • 类似于模型属性的 [Required] 属性。
    • @DavidKlempfner 好的,看看我的下一个模型示例
    【解决方案3】:

    您可以在请求管道中添加您的验证,如下面的 Startup.cs 配置部分。

    app.Use(async(context,next)=>{
                    var companyHeader=context.Request.Headers["xCompanyId"];
                    if(companyHeader==null)
                    {
                      context.Response.StatusCode=400;//Bad request if no companyHeader
                      await context.Response.CompleteAsync();
                    }
                    else{
                    await next.Invoke();}
                });
    

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2020-09-14
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多