【问题标题】:Use HttpRequest in validation context在验证上下文中使用 HttpRequest
【发布时间】:2018-10-22 16:17:19
【问题描述】:

在 .net Framework HttpContext 来获取当前的 HttpRequest

例如,我有一段代码如下所示:

public sealed class AccessValidator : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext context)
    {
        // validate stuff, if all true -> yield ok.

        // if is not valid
        var request = HttpContext.Current.Request;

        // store/log the request payload.
    }

}

使用 .net Core 2.1 时无法做到这一点。 我看到一篇关于注入IHttpContextAccessor 什么的帖子,但它几乎在每个地方都暴露了请求。

由于这是我服务器的外部库,我希望它不依赖服务器代码注入,因为这样会产生我不想成为的依赖。

是否有任何已知的方法来处理这个或解决这个问题?

【问题讨论】:

  • 我认为负面的改装不再有效,这是一个有合法答案的合法问题。

标签: c# validation asp.net-core .net-core httpcontext


【解决方案1】:

您可以通过结合使用IHttpContextAccessorValidationContext.GetService 来实现此目的。这是它的样子:

protected override ValidationResult IsValid(object value, ValidationContext context)
{
    // validate stuff, if all true -> yield ok.

    // if is not valid
    var httpContextAccessor = (IHttpContextAccessor)context.GetService(typeof(IHttpContextAccessor));
    var request = httpContextAccessor.HttpContext.Request;

    // store/log the request payload.
}

它不使用依赖注入,而是使用服务定位器模式(considered an anti-pattern,但这可能是您唯一真正的选择)。

您还需要使用Startup.ConfigureServices 中的DI 容器配置IHttpContextAccessor,如下所示:

services.AddHttpContextAccessor();

【讨论】:

  • 但这会产生对服务器代码的依赖。不是吗?或者 services.AddHttpContextAccessor 可以写在库的某个地方?
  • 是的,您需要在 ASP.NET Core 项目本身中调用AddHttpContextAccessor。如果你真的想避免这种情况,你就会挣扎......你所说的“依赖”有什么问题?
  • @OriRefael:与在以前的版本中调用静态HttpContext.Current 相比,依赖关系如何减少? XD。你也可以在你的库中注册AddHttpContextAccessor AddMyLibrary 扩展方法,所以它对你的库消费者不透明
  • 在之前的框架中,你依赖于你在http score中的事实,如果你在服务器上使用validation属性就很明显了。这需要在服务器上编写代码只是为了使外部引用工作..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 2020-04-03
  • 2019-11-01
相关资源
最近更新 更多