Return 当 header 不存在时负载中的错误消息

Return error msg in payload when header not present

我有这个操作方法:

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

上面action方法中的HeaderCompanyIdclass定义在这里:

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>();
    }
}

我可以看到 header 在 Swagger UI 中标记为强制性。 但是当我到达 xCompanyIdModelState.IsValid = true 没有值的端点时,我没有收到关于需要 header 的错误消息。

如何return一个4XX来表示需要xCompanyIdheader? 理想情况下,如果我在操作方法中放置一个断点,它甚至不应该被击中。

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

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

您可以在 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();}
            });

此外,您可以尝试使用模型代替 'Guid' 参数

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

使用您的自定义模型

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