你不能也不应该。这完全违背了依赖注入系统的全部目的。静态类(用于运行时数据或服务定位器)是一种反模式。
在 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
or Transient
模式,它不能是Singleton
, 因为HttpContext
仅在请求期间有效。
或者如果SomeClassInClassLibrary
必须是单例,你必须注入一个工厂并解析IRequestInformation
按需(即在动作内)。
最后但并非最不重要的,IHttpContextAccessor
默认情况下未注册。
IHttpContextAccessor 可用于访问当前线程的 HttpContext。然而,维持这种状态会带来不小的性能成本,因此它已从默认服务集中删除。
依赖它的开发人员可以根据需要将其添加回来:services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Source: 默认情况下未注册 IHttpContextAccessor 服务 https://github.com/aspnet/Announcements/issues/190#issue-159298966