Vnu*_*uuk 2 c# c#-6.0 asp.net-core-mvc .net-core asp.net-core
我有静态助手类
public static class Current
{
public static string Host
{
get { return "httpContextAccessor here"; }
}
}
Run Code Online (Sandbox Code Playgroud)
如何在Host属性中访问当前的HttpContext?
你不能,也不应该.这完全打破了依赖注入系统的全部目的.静态类(用于运行时数据或服务定位器)是反模式.
在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*/; }
}
}
Run Code Online (Sandbox Code Playgroud)
并在您的类库中注入它:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,您SomeClassInClassLibrary必须使用Scoped或Transient模式解决,但不能Singleton,因为HttpContext它仅在请求期间有效.
或者,如果SomeClassInClassLibrary必须是单身,则必须注入工厂并解决IRequestInformation按需(即在动作内).
最后但并非最不重要的IHttpContextAccessor是,默认情况下未注册.
IHttpContextAccessor可用于访问当前线程的HttpContext.但是,维护此状态具有非常重要的性能成本,因此已从默认服务集中删除.
依赖它的开发人员可以根据需要添加它:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
来源:默认情况下未注册IHttpContextAccessor服务
| 归档时间: |
|
| 查看次数: |
2546 次 |
| 最近记录: |