2016-08-10 70 views
3

我需要在控制器外部的AspNet Core中獲取HttpContext。在較舊的AspNet 4中,我可以使用HttpContext.Current獲取它,但它似乎在新的AspNet中被刪除。我發現的唯一的解決方法是通過依賴注入解決的IHttpContextAccessor,並要求它的HttpContext,而是注入IHttpContextAccessor我需要IHttpContextAccessor添加在應用程序啓動一個單:在控制器外部的AspNet Core 1.0.0中獲取HttpContext

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
} 

我研究它,這是我發現的唯一方法。我谷歌它和IHttpContextAccessor被刪除作爲默認的依賴解析器,因爲它是非常重的依賴。有沒有其他方法可以實現這一點?

編輯: 我不知道,而不是將其作爲一個Singleton的依賴解析器,我可以在同一個地方得到HttpContextAccessor的情況下將其保存在自己的單身類?

+0

如果您需要在類中獲得'HttpContext',那麼使用IHttpContextAccessor'有什麼問題?你的代碼運行良好(只需使用構造函數注入)。 –

+0

是的,但它的工作,我需要添加IHttpContextAccessor作爲依賴。我想知道是否在同一個地方我不能直接獲取實例?我將編輯該問題。 – yosbel

+0

@ademcaglin所以它似乎是實現它的方式。現在,是否可以直接獲取實例,而不是添加到服務中,然後通過DI獲取?在我看來,如果我可以將它添加到DI中,應該有可能將它放在同一個地方。是嗎? – yosbel

回答

5

如果您將傳統應用程序移植到相當複雜的ASP.Net Core,則需要完全重新設計才能在.Net Core DI系統中正常工作。如果你不想這樣做,你可以通過在服務定位器中再次使用全局功能來「欺騙」。要做到這一點(不推薦,如果你能避免它):

public class RequestContextManager 
{ 
    public static RequestContextManager Instance { get; set; } 

    static RequestContextManager() 
    { 
    Instance = new RequestContextManager(null); 
    } 

    private readonly IHttpContextAccessor contextAccessor; 

    public RequestContextManager(IHttpContextAccessor contextAccessor) 
    { 
    this.contextAccessor = contextAccessor; 
    } 

    public HttpContext CurrentContext 
    { 
    get 
    { 
     if (contextAccessor == null) 
     return null; 
     return contextAccessor.HttpContext; 
    } 
    } 
} 

// In Startup.cs 
public void Configure(IApplicationBuilder app,...) 
{ 
    ... 
    RequestContextManager.Instance = new RequestContextManager(app.ApplicationServices.GetService<IHttpContextAccessor>()); 
    ... 
} 

// In your code 
var httpContext = RequestContextManager.Instance.CurrentContext; 
+0

這有同樣的問題,我試圖解決,沒有添加IHttpContextAccessor作爲一個單身人士。如果您不添加它,您的代碼將在最新的AspNet Core中引發異常。 – yosbel

+1

是否有任何特殊的原因,您不想添加代碼行以將其添加爲依賴項?如果你這樣做,將工作 –

+0

我只想知道是否有可能或者如果有另一種方式,我不清楚爲什麼它被刪除作爲默認,爲什麼控制器有HttpContext,即使我不'不要添加這一行,控制器如何解決它?但如果這是唯一的方法...... :) – yosbel

2

要使HttpContext有效,調用您的類的程序流必須來自控制器或某個中間件組件。您可以將對HttpContext的引用傳遞給您的類。

2

直接回答爲什麼,這GitHub Announcement指出,這是不平凡的,以保持在IHttpContextAccessor跟蹤的HttpContext狀態的問題。所以它被轉移到只需要。 HttpContext仍然可以在Controller中使用,但是,如果沒有這樣的注入。

我不相信你會在項目級別上引入一個新的依賴關係,只需通過依賴注入來引入類,或者在需要時從IServiceProvider中獲取它。

相關問題