【问题标题】:How properly inject HttpContext in MVC6如何在 MVC6 中正确注入 HttpContext
【发布时间】:2015-03-10 17:21:11
【问题描述】:

我的 API 中的数据服务层需要 httpcontext 中的请求信息,我阅读了这个 question,他们说我应该使用 ActionContext 而不是 HttpContext.Current(在 MVC6 中停止)。

第一种方法是通过覆盖这个方法来设置控制器内部的数据:

public void OnActionExecuting(ActionExecutingContext context)
{
    var routeData = context.RouteData;
    var httpContext = context.HttpContext;
    ...
}

或者通过注入服务层来使用DI

public MyService(IContextAccessor<ActionContext> contextAccessor)
{
    _httpContext = contextAccessor.Value.HttpContext;
    _routeData = contextAccessor.Value.RouteData;
}

但我不确定下面列出的两行代码是否是执行 DI 的正确方法

services.AddTransient<IContextAccessor<ActionContext>,ContextAccessor>();
services.AddTransient<IContextAccessor<ActionContext>>();

当我这样做时,我得到了这个错误。

尝试激活时无法解析类型“Microsoft.AspNet.Mvc.ActionContext”的服务

更新 project.json 网络项目

"DIMultiTenan.Infrastructure": "",
"DIMultiTenan.MongoImplementation": "", 
"Microsoft.AspNet.Server.IIS": "1.0.0-beta3",
"Microsoft.AspNet.Mvc": "6.0.0-beta3",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta3",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta3"

【问题讨论】:

  • 删除第一行并重试
  • 抱歉造成混乱,但我当时尝试了一行代码
  • 你试过用 AddScopped 代替 AddTransient 吗?
  • 顺便问一下,您使用的是 Beta3 还是最新的开发代码。
  • 查看更新问题 我为 web 项目添加了 project.json 文件。我正在使用 vs2015 CTP 6

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


【解决方案1】:

如果您尝试访问HttpContext,那么您可以为此目的使用IHttpContextAccessor

例子:

services.AddTransient<QueryValueService>();

public class QueryValueService
{
    private readonly IHttpContextAccessor _accessor;

    public QueryValueService(IHttpContextAccessor httpContextAccessor)
    {
        _accessor = httpContextAccessor;
    }

    public string GetValue()
    {
        return _accessor.HttpContext.Request.Query["value"];
    }
}

请注意,在上面的示例中,QueryValueService 应仅注册为 TransientScoped 而不是 Singleton,因为 HttpContext 是基于每个请求的...

【讨论】:

  • 您的 QueryValueService 仅在我的情况下获取查询信息,我需要来自标头请求集合的信息。但是感谢您的帮助
  • @Son_of_Sam:这只是一个示例 :-),确保您也可以从上下文中存在的请求中获取标头信息。
  • 我对代码做了一个小(但很重要)的改动。我将对.HttpContext 的调用移出构造函数。这很重要,因为injection constructors should be simple。该调用使构造函数有可能失败,并使验证对象图变得更加困难。
  • @Steven 如果是这种情况,您将注入一个生成存储库的工厂并且您只需要该存储库的场景,在 ctor 中您将使用工厂方法设置 IReposotory。
  • @steve,这是一个关于我要做什么的问题stackoverflow.com/questions/29113206/…,我会听取你的意见,之后我会给你买杯咖啡
猜你喜欢
  • 1970-01-01
  • 2015-12-11
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多