Возвратите сообщение об ошибке в полезной нагрузке, когда заголовок отсутствует - PullRequest
1 голос
/ 11 февраля 2020

У меня есть этот метод действия:

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

Класс 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 нужен? В идеале, если я добавлю точку останова в метод действия, он даже не должен получить удар.

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Кроме того, вы можете попробовать использовать модель вместо параметра «Guid»

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

использовать собственную модель

public class YourCustomHeader
{
    [Required]
    public string xCompanyId { get; set; }
}
0 голосов
/ 12 февраля 2020

Вы можете добавить свою валидацию в строку конвейера запроса, как показано ниже в части конфигурации 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();}
            });
0 голосов
/ 11 февраля 2020

А как насчет простой проверки в методе API:

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