gpt4 book ai didi

asp.net-core - 自定义内容类型验证过滤器?

转载 作者:行者123 更新时间:2023-12-02 01:16:28 32 4
gpt4 key购买 nike

我想实现一个自定义的内容类型验证过滤器,以便可以提供 415 不支持的媒体类型的自定义错误模型。

类似这样的事情:

public class ValidateContentTypeFilterAttribute : ActionFilterAttribute
{
private const string JsonMimeType = "application/json";

public override void OnActionExecuting(ActionExecutingContext context)
{
string requestMethod = context.HttpContext.Request.Method.ToUpper();

if (requestMethod == WebRequestMethods.Http.Post || requestMethod == WebRequestMethods.Http.Put)
{
if (request.ContentType != JsonMimeType)
{
// "Unsupported Media Type" HTTP result.
context.Result = new HttpUnsupportedMediaTypeResult();
return;
}
}
}
}

问题在于,MVC 管道似乎在执行任何自定义过滤器之前“捕获”不受支持或无效的 Content-Type 值。即使是“application/xml”内容类型也会被拒绝。

在哪里配置?

我的 MVC 配置仅包含以下内容:

public void ConfigureServices(IServiceCollection services)
{
services
.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
options.SerializerSettings.Converters.Add(new SquidJsonConverter());
})
.AddMvcOptions(options =>
{
options.Filters.Add(typeof(ValidateAntiForgeryTokenAttribute));
options.Filters.Add(typeof(ValidateContentTypeFilterAttribute));
options.Filters.Add(typeof(ValidateAcceptFilterAttribute));
options.Filters.Add(typeof(ValidateModelFilterAttribute));
});
...
}

最佳答案

操作过滤器在处理管道中对于您在这里想要实现的目标来说太晚了。

“传入”请求的过滤器执行顺序如下:

  1. 授权过滤器的 OnAuthorization.. 方法调用
  2. 资源过滤器的 OnResourceExecuting.. 方法调用模型
  3. 发生模型绑定(bind)(这是内容类型检查的地方制作)
  4. 操作过滤器的 OnActionExecuting.. 方法调用
  5. 操作执行发生

您可以创建一个资源过滤器。一个例子:

public class CustomResourceFilter : IResourceFilter
{
private readonly string jsonMediaType = "application/json";

public void OnResourceExecuted(ResourceExecutedContext context)
{
}

public void OnResourceExecuting(ResourceExecutingContext context)
{
if (context.HttpContext.Request.Method == "PUT" || context.HttpContext.Request.Method == "POST")
{
if (!string.Equals(
MediaTypeHeaderValue.Parse(context.HttpContext.Request.ContentType).MediaType,
jsonMediaType,
StringComparison.OrdinalIgnoreCase))
{
context.Result = new JsonResult(new { Error = "An error message here" }) { StatusCode = 415 };
}
}
}
}

如果您想修改所有类型的 UnsupportedMediaTypeResult 响应,那么您可以编写一个结果过滤器。

传出响应的过滤器管道是:

  • 操作过滤器的 OnActionExecuted... 方法调用
  • 结果过滤器的 OnResultExecuting.. 方法调用
  • 结果过滤器的 OnResultExecuted.. 方法调用
  • 资源过滤器的 OnResourceExecuted.. 方法调用
  • 带有结果过滤器的示例:

    public class CustomResultFilter : ResultFilterAttribute
    {
    public override void OnResultExecuting(ResultExecutingContext context)
    {
    var result = context.Result as UnsupportedMediaTypeResult;
    if (result != null)
    {
    context.Result = new JsonResult(new { Error = "An error message here" }) { StatusCode = 415 };
    }
    }
    }

    关于asp.net-core - 自定义内容类型验证过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38272630/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com