.NET Core IHttpContextAccessor问题

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?

Tse*_*eng 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*/; }
    }
}
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服务