我有静态助手类
VALUE
7
如何在Host属性中访问当前的HttpContext?
答案 0 :(得分:5)
你不能也不应该。这完全打破了依赖注入系统的全部目的。静态类(用于运行时数据或服务定位器)是一种反模式。
在ASP.NET Core中,您必须在需要它的类中注入IHttpContextAccessor
。您可以创建一个非静态类,并执行以下操作:
public class RequestInformation : IRequestInformation
{
private readonly HttpContext context;
public RequestInformation(IHttpContextAccessor contextAccessor)
{
// Don't forget null checks
this.context = contextAccessor.HttpContext;
}
public string Host
{
get { return this.context./*Do whatever you need here*/; }
}
}
并在你的类库中注入它:
public class SomeClassInClassLibrary
{
private readonly IRequestInformation requestInfo;
public SomeClassInClassLibrary(IRequestInfomation requestInfo)
{
// Don't forget null checks
this.requestInfo = requestInfo;
// access it
var host = requestInfo.Host;
}
}
请注意,您的SomeClassInClassLibrary
必须使用Scoped
或Transient
模式解决,且不能Singleton
,因为HttpContext
仅有效在请求期间。
或者,如果SomeClassInClassLibrary
必须是单身,则必须注入工厂并按需解决IRequestInformation
(即在操作中)。
最后但并非最不重要的是,默认情况下未注册IHttpContextAccessor
。
IHttpContextAccessor可用于访问当前线程的HttpContext。但是,维护此状态具有非常重要的性能成本,因此已从默认服务集中删除。
依赖它的开发人员可以根据需要添加它:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
来源:The IHttpContextAccessor service is not registered by default