【问题标题】:.Net Core Global Filter.Net Core 全局过滤器
【发布时间】:2019-04-02 15:02:35
【问题描述】:

这是我第一次使用Filter,但它不起作用。这是一个非常简单的例子。响应头中没有添加任何内容,并且在过滤器类中没有命中断点。我希望这是一个全局过滤器。我错过了什么或做错了什么?

过滤器

public class TestFilter : IResultFilter
{
    public void OnResultExecuted(ResultExecutedContext context)
    {
        throw new NotImplementedException();
    }

    public void OnResultExecuting(ResultExecutingContext context)
    {
        var headerName = "OnResultExecuting";
        context.HttpContext.Response.Headers.Add(
            headerName, new string[] { "ResultExecutingSuccessfully" });
    }
}

STARTUP.CS

public void ConfigureServices(IServiceCollection services)
{
    var logger = _loggerFactory.CreateLogger<Startup>();
    services.AddCors();

    services.AddMvc(options =>
    {
        options.Filters.Add(new TestFilter());
    });
}

控制器方法:

[HttpGet("", Name = "search")]
[ProducesResponseType(typeof(PagedResult<SearchViewModel>), (int)HttpStatusCode.OK)]
public async Task<IActionResult> Get()

【问题讨论】:

  • 你真的不应该从过滤器中抛出NotImplementedException。这将中断一切并阻止您获得任何有效的结果。另请注意,结果过滤器仅在 MVC 操作有正确结果时才会执行。因此,您必须验证您正在使用正常工作的 MVC 操作对其进行测试。 – 你有任何错误吗?
  • @poke...您对 NotImplementedException 的评论是有效的,但现在只是一个测试。我已将此代码添加到工作应用程序中。没有错误被抛出
  • 这是您添加的ResultFilter。您确定您调用的操作返回了 IActionResult
  • @haim770...是的,但是任务。会是这样吗?我需要让它异步吗?
  • @BigDaddy 如果不是async,那么Task.Result 没有被解包,因此它可能是一个问题,因为框架可能不认为它是有效的IActionResult...

标签: c# asp.net-core asp.net-core-2.0


【解决方案1】:

为了让 javascript 在发出跨域请求时读取响应标头,您需要在 ASP.NET Core 应用程序中构建 CORS 策略,将 exposes 某些标头发送给客户端

services.AddCors(options =>
{
    options.AddPolicy("ResultHeader", policy =>
    {
        policy
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .WithExposedHeaders("OnResultExecuting"); //headers to be exposed
    });
});

而且你在全局范围内使用它

app.UseCors("Default");

或仅用于特定的操作/控制器

[HttpGet("", Name = "search")]
[ProducesResponseType(typeof(PagedResult<SearchViewModel>), (int)HttpStatusCode.OK)]
[EnableCors("ResultHeader")] //enabling cors requests
public async Task<IActionResult> Get()

【讨论】:

  • 这就是我所缺少的(javascript 客户端): .WithExposedHeaders("OnResultExecuting"); //要暴露的标题
  • Access-Control-Expose-Headers 有我添加的标题。对于像 Content-Disposition 这样的通用 header,客户端是否需要做任何事情来检索它?
  • @BigDaddy 根据我的回答中引用的文章,只有Accept, Accept-Language, Content-Language, Content-Type 标头始终可用,您无需“公开”它们,我只需使用不同的浏览器对其进行测试即可查看如果某些标头可用并且应该公开或不公开。关于断点,我不知道。显然过滤器被执行了,你可以看到结果,所以调试应该有问题,但我不能说到底是什么。
  • 问题是我在这个网站上没有控制器。它是一个网关 api - 充当反向代理。所以,我得到的唯一钩子是在 Configure 和 ConfigureServices 中。我认为自定义中间件是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-05-18
  • 2021-08-21
  • 1970-01-01
  • 2014-09-20
  • 2023-01-25
相关资源
最近更新 更多