需要通过构造函数或其他方式从Razor过滤器方法访问HttpContext

杰森·谢夫(Jason Shave)

我已经阅读了有关此问题的所有其他帖子,并且确定这不是重复的。

我正在构建要在我的Startup.cs课程中使用的Razor页面过滤器,我需要访问HttpContext我通常会使用ASP.NET Core的DI功能通过构造函数注入来做到这一点。我什至拥有通常的services.AddHttpContextAccessor()声明,Startup.cs并在项目的其他地方使用它。

由于我正在建立一个Razor页面过滤器,该页面过滤器IAsyncPageFilter是从派生的,并且是从Startup.cs该类创建的,因此似乎无法注入它(因为它是由启动创建的,而不是注入的)。

这是过滤器添加到Startup.cs

Startup.cs(剪裁)

    services.AddMvc(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
        options.Filters.Add(new RazorAsyncPageFilter(_logger, Configuration)); <---my filter
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

这是我的过滤器:

RazorAsyncPageFilter.cs

    public class RazorAsyncPageFilter : IAsyncPageFilter
    {
        private readonly ILogger _logger;
        private readonly IConfiguration _configuration;

        public string[] Scopes { get; set; }
        public string ScopeKeySection { get; set; }

        public RazorAsyncPageFilter(ILogger logger, IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
        }
        public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
        {
            await Task.CompletedTask;
        }

        public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
        {
            VaultGraphServiceClient.OnMsalUiExceptionEvent += VaultGraphServiceClientOnOnMsalUiExceptionEvent;
            await next.Invoke();
        }
        
        private void VaultGraphServiceClientOnOnMsalUiExceptionEvent(object sender, MsalUiRequiredException e)
        {
            _logger.LogInformation($"Triggered authentication exception: {e.Message}");
            Scopes = new string[] { _configuration.GetValue<string>(ScopeKeySection) };
            var properties = BuildAuthenticationPropertiesForIncrementalConsent(Scopes, e, **I_NEED_CONTEXT_HERE**);
            new ChallengeResult(properties);
        }
    }

请注意从另一个类的事件处理程序触发的方法调用中需要的上下文。我想将传递HttpContext给filter类中的private方法。

这是我尝试过的:

  1. Startup.csfor中定义一个字段IHttpContextAccessor _httpContext并将其传递给过滤器,但是由于该上下文尚未建立,因此这显然不起作用。

  2. 通过其他方法传递上下文。这还需要更多工作,并且充满了有关将其传递给后台线程的警告

  3. 从我的呼唤中注入语境EventHandler不幸的是,这是从静态类中调用的,并且据我了解,静态类中没有DI的概念。这个对吗?另外,我正在使用一个EventHandler委托,委托用于传递MsalUiRequiredException对象,并且只能传递一个对象。也许我可以为该event类型使用其他处理程序,但是我对事件不够熟悉,无法理解如何实现。

  4. 我正在考虑创建一个自定义类,以容纳MsalUiRequiredExceptionHttpContext可以在其他地方注入/传递它位置,但这似乎有点过头,或者可能是上述#2的问题。

有什么建议?

亚力山大

添加IHttpContextAccessor为构造函数参数

public RazorAsyncPageFilter(ILogger logger, IConfiguration configuration, IHttpContextAccessor httpContext)
{
    _logger = logger;
    _configuration = configuration;
    _httpContext = httpContext;
}

并按类型添加过滤器

options.Filters.Add<RazorAsyncPageFilter>()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过反射或其他方式覆盖Java final方法?

用Python方式构造列表过滤器

如何使用休眠过滤器或其他方式在spring数据jpa中实现行级安全性?

我可以通过@HostBinding以外的其他方式访问主机绑定吗?

Angular-以除构造函数外的其他方式注入?

如何将Django过滤器args作为参数传递给其他函数

构造函数和其他方法的函数通信问题?

通过其他方法访问位置变量

什么时候应该通过类型类或其他方式定义多态函数?

Django QuerySet过滤器通过id和其他列获取queryset

需要在函数顶部调用其他方法

什么构造函数需要访问其他类中的许多方法?

过滤器函数内部的访问变量

在其他方法/函数中的构造函数中调用对象

Python-还有其他方法可以在列表推导中应用函数和过滤器吗?

用其他方法调用函数

通过其他方式从MySQLi过滤数据

从过滤器访问组件方法

除了引用以外,还可以通过其他方式访问子组件状态?

应用过滤器,然后通过宏修改其他列

限制通过VPN或GKE上的其他方式访问Kubernetes UI

有没有一种方法可以从连接过滤器和其他过滤器中导出等效过滤器?

如何以可以从 C# 中的其他方法访问的方式存储随机类变量?

Xamarin Forms Prism:是否需要在构造函数中传递 INavigationService?除了构造函数注入之外的任何其他方式

SQL Server - 条件/过滤外键。其他方式

通过构造函数将方法参数发送到动作过滤器

需要其他方式来编写 SELECT 查询

通过 Microsoft Graph 数据连接或内容搜索或其他方式进行就地存档访问

“预期在箭头函数结束时返回一个值” - 除了过滤器之外,还有其他方法可以做到这一点吗?