gpt4 book ai didi

asp.net-core - 在 Controller 外部的 AspNet Core 1.0.0 中获取 HttpContext

转载 作者:行者123 更新时间:2023-12-01 08:52:09 27 4
gpt4 key购买 nike

我需要在 Controller 外部获取 AspNet Core 中的 HttpContext。在旧的 AspNet 4 中,我可以使用 HttpContext.Current 来获取它,但它似乎在新的 AspNet 中被删除了。我发现的唯一解决方法是通过依赖注入(inject)解析 IHttpContextAccessor 并询问它 HttpContext,但要注入(inject) IHttpContextAccessor,我需要在应用程序启动中将 IHttpContextAccessor 添加为单例:

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

我研究了它,这是我找到的唯一方法。我用谷歌搜索它,IHttpContextAccessor 在依赖解析器中作为默认值被删除,因为它是非常重的依赖。有没有其他方法可以做到这一点?

编辑:我想知道是否可以将其作为单例添加到依赖解析器中,而不是在同一个地方获取 HttpContextAccessor 的实例以将其保存在我自己的单例类中?

最佳答案

如果您要将旧应用程序移植到相当复杂的 ASP.Net Core,则需要完全重新设计才能与 .Net Core DI 系统正常工作。如果您不想这样做,您可以通过在服务定位器中再次将此功能设为全局来“作弊”。这样做(如果可以避免的话,不建议这样做):

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;

关于asp.net-core - 在 Controller 外部的 AspNet Core 1.0.0 中获取 HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38875287/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com