.NET Core IHttpContextAccessor问题

时间:2016-10-28 11:21:21

标签: c# asp.net-core asp.net-core-mvc .net-core c#-6.0

我有静态助手类

VALUE
7

如何在Host属性中访问当前的HttpContext?

1 个答案:

答案 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必须使用ScopedTransient模式解决,且不能Singleton,因为HttpContext仅有效在请求期间。

或者,如果SomeClassInClassLibrary必须是单身,则必须注入工厂并按需解决IRequestInformation(即在操作中)。

最后但并非最不重要的是,默认情况下未注册IHttpContextAccessor

  

IHttpContextAccessor可用于访问当前线程的HttpContext。但是,维护此状态具有非常重要的性能成本,因此已从默认服务集中删除。

     

依赖它的开发人员可以根据需要添加它:   services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

来源:The IHttpContextAccessor service is not registered by default