在控制器外部的 AspNet Core 1.0.0 中获取 HttpContext
Get HttpContext in AspNet Core 1.0.0 outside a Controller
我需要在控制器外部获取 AspNet Core 中的 HttpContext。在旧的 AspNet 4 中,我可以使用 HttpContext.Current 获取它,但它似乎在新的 AspNet 中被删除了。我发现的唯一解决方法是通过依赖注入解析 IHttpContextAccessor 并询问它 HttpContext,但要注入 IHttpContextAccessor,我需要在应用程序启动中将 IHttpContextAccessor 作为单例添加:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
我研究过它,这是我找到的唯一方法。我 google 它和 IHttpContextAccessor 作为依赖解析器中的默认值被删除,因为它是非常严重的依赖。还有其他方法可以实现吗?
编辑:
我想知道我是否可以在同一个地方获取 HttpContextAccessor 的实例,而不是将其作为单例添加到依赖项解析器,以将其保存在我自己的单例中 class?
要使 HttpContext 有效,调用您的 class 的程序流必须源自控制器或某些中间件组件。您可以将对 HttpContext 的引用传递给您的 class.
如果您要将遗留应用程序移植到相当复杂的 ASP.Net 核心,则需要完全重新设计才能与 .Net 核心 DI 系统正常工作。如果您不想这样做,您可以 'cheat' 通过在服务定位器中再次将此功能设为全局。为此(如果可以避免,不推荐这样做):
public class RequestContextManager
{
public static RequestContextManager Instance { get; set; }
static RequestContextManager()
{
Instance = new RequestContextManager(null);
}
private readonly IHttpContextAccessor contextAccessor;
public RequestContextManager(IHttpContextAccessor contextAccessor)
{
this.contextAccessor = contextAccessor;
}
public HttpContext CurrentContext
{
get
{
if (contextAccessor == null)
return null;
return contextAccessor.HttpContext;
}
}
}
// In Startup.cs
public void Configure(IApplicationBuilder app,...)
{
...
RequestContextManager.Instance = new RequestContextManager(app.ApplicationServices.GetService<IHttpContextAccessor>());
...
}
// In your code
var httpContext = RequestContextManager.Instance.CurrentContext;
为了直接回答为什么的问题,这个 GitHub Announcement 声明在 IHttpContextAccessor 中跟踪 HttpContext 状态非常重要。因此,它仅按需移动。 HttpContext 在控制器中仍然可用,但是,没有注入它。
我不相信你在项目级别引入新的依赖,只是通过依赖注入进入 类,或者在需要时从 IServiceProvider 中获取它。
我需要在控制器外部获取 AspNet Core 中的 HttpContext。在旧的 AspNet 4 中,我可以使用 HttpContext.Current 获取它,但它似乎在新的 AspNet 中被删除了。我发现的唯一解决方法是通过依赖注入解析 IHttpContextAccessor 并询问它 HttpContext,但要注入 IHttpContextAccessor,我需要在应用程序启动中将 IHttpContextAccessor 作为单例添加:
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
我研究过它,这是我找到的唯一方法。我 google 它和 IHttpContextAccessor 作为依赖解析器中的默认值被删除,因为它是非常严重的依赖。还有其他方法可以实现吗?
编辑: 我想知道我是否可以在同一个地方获取 HttpContextAccessor 的实例,而不是将其作为单例添加到依赖项解析器,以将其保存在我自己的单例中 class?
要使 HttpContext 有效,调用您的 class 的程序流必须源自控制器或某些中间件组件。您可以将对 HttpContext 的引用传递给您的 class.
如果您要将遗留应用程序移植到相当复杂的 ASP.Net 核心,则需要完全重新设计才能与 .Net 核心 DI 系统正常工作。如果您不想这样做,您可以 'cheat' 通过在服务定位器中再次将此功能设为全局。为此(如果可以避免,不推荐这样做):
public class RequestContextManager
{
public static RequestContextManager Instance { get; set; }
static RequestContextManager()
{
Instance = new RequestContextManager(null);
}
private readonly IHttpContextAccessor contextAccessor;
public RequestContextManager(IHttpContextAccessor contextAccessor)
{
this.contextAccessor = contextAccessor;
}
public HttpContext CurrentContext
{
get
{
if (contextAccessor == null)
return null;
return contextAccessor.HttpContext;
}
}
}
// In Startup.cs
public void Configure(IApplicationBuilder app,...)
{
...
RequestContextManager.Instance = new RequestContextManager(app.ApplicationServices.GetService<IHttpContextAccessor>());
...
}
// In your code
var httpContext = RequestContextManager.Instance.CurrentContext;
为了直接回答为什么的问题,这个 GitHub Announcement 声明在 IHttpContextAccessor 中跟踪 HttpContext 状态非常重要。因此,它仅按需移动。 HttpContext 在控制器中仍然可用,但是,没有注入它。
我不相信你在项目级别引入新的依赖,只是通过依赖注入进入 类,或者在需要时从 IServiceProvider 中获取它。