Return 当 header 不存在时负载中的错误消息
Return error msg in payload when header not present
我有这个操作方法:
[HttpGet]
public virtual async Task<IActionResult> GetModifiedSince([HeaderCompanyId] Guid? xCompanyId)
{
...
}
上面action方法中的HeaderCompanyId
class定义在这里:
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 中标记为强制性。
但是当我到达 xCompanyId
和 ModelState.IsValid = true
没有值的端点时,我没有收到关于需要 header 的错误消息。
如何return一个4XX来表示需要xCompanyId
header?
理想情况下,如果我在操作方法中放置一个断点,它甚至不应该被击中。
在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; }
}
我有这个操作方法:
[HttpGet]
public virtual async Task<IActionResult> GetModifiedSince([HeaderCompanyId] Guid? xCompanyId)
{
...
}
上面action方法中的HeaderCompanyId
class定义在这里:
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 中标记为强制性。
但是当我到达 xCompanyId
和 ModelState.IsValid = true
没有值的端点时,我没有收到关于需要 header 的错误消息。
如何return一个4XX来表示需要xCompanyId
header?
理想情况下,如果我在操作方法中放置一个断点,它甚至不应该被击中。
在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; }
}