2016-06-13 173 views
4

在Asp.Net會議的早期版本可以在任何頁面訪問喜歡用如何通過靜態變量訪問ASP.NET Core中的會話?

System.Web.HttpContext.Current.Session["key"] 

在Asp.Net的核心,如何通過控制器進行調用不同的類來訪問會話,而沒有經過會話屬性靜態變量在所有類

+1

閱讀文檔如何?它在ASP.NET Core的這個階段有很好的描述:https://docs.asp.net/en/latest/fundamentals/app-state.html#installing-and-configuring-session – Tseng

+0

在我看到的所有示例中該網站,我只能看到「HttpContext objContext」對象作爲參數傳遞給方法/委託,而會話作爲objContext.Session訪問。我認爲就像早些時候的Asp.Net一樣,像HttpContext.Current.Session一樣,這樣可以避免傳遞額外的參數 – Navaneeth

+2

在控制器內部可以訪問HttpContext(如果控制器來自'Controller'基類)否則你必須注入'IHttpContextAccessor' – Tseng

回答

5

修訂辦法16年1月17日說明修正錯誤

注入的 IHttpContextAccessor實例

首先,我假設您已將ASP.NET Core應用程序配置爲使用會話狀態。如果沒有看到@ slfan的答案How to access the Session in ASP.NET Core via static variable?

如何訪問通過控制器叫法不同堂課,而未通過會話屬性作爲附加參數中的所有類

Asp.Net核心是構造設計圍繞依賴注入,一般來說設計者沒有提供對上下文信息的很多靜態訪問。更具體地說,沒有相當於System.Web.HttpContext.Current

在控制器,你可以通過this.HttpContext.Session可以訪問會話瓦爾但是你明確地詢問如何可以訪問由控制器調用的方法的會話,而不傳遞會話屬性作爲參數。

所以,爲此,我們需要設置自己的靜態類來提供對會話的訪問,並且我們需要一些代碼來在啓動時初始化該類。由於一個人可能需要靜態訪問整個對象,而不僅僅是我採取了這種方法。

所以首先我們需要靜態類:

using Microsoft.AspNetCore.Http; 
using System; 
using System.Threading; 

namespace App.Web { 

    public static class AppHttpContext { 
     static IServiceProvider services = null; 

     /// <summary> 
     /// Provides static access to the framework's services provider 
     /// </summary> 
     public static IServiceProvider Services { 
      get { return services; } 
      set { 
       if(services != null) { 
        throw new Exception("Can't set once a value has already been set."); 
       } 
       services = value; 
      } 
     } 

     /// <summary> 
     /// Provides static access to the current HttpContext 
     /// </summary> 
     public static HttpContext Current { 
      get { 
       IHttpContextAccessor httpContextAccessor = services.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor; 
       return httpContextAccessor?.HttpContext; 
      } 
     } 

    } 
} 

接下來我們需要一個服務添加到DI容器,可以爲當前HttpContext提供接入。此服務隨Core MVC框架一起發佈,但未默認安裝。所以我們需要用一行代碼「安裝」它。該行雲在Startup.cs文件的ConfigureServices方法,可以在任何地方的方法位於:

//Add service for accessing current HttpContext 
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();  

接下來,我們需要設置我們的靜態類,以便它可以訪問DI容器獲取服務我們剛剛安裝。下面的代碼出現在Startup.cs文件的Configure方法中。該生產線可設在該方法中的任何地方:

AppHttpContext.Services = app.ApplicationServices; 

現在,任何由Controller調用,即使通過異步等待模式的方法,可以通過AppHttpContext.Current

訪問當前HttpContext所以,如果我們使用在Microsoft.AspNetCore.Http命名空間Session擴展方法,我們可以節省名爲「伯爵」到會話的int可以做這樣的:

AppHttpContext.Current.Session.SetInt32("Count", count); 

和檢索的int從會議名爲「伯爵」可以做這樣的:

int count count = AppHttpContext.Current.Session.GetInt32("Count"); 

享受。

+1

@ Ron C很好的答案。向其他人發出通知,替換'await next();'用'await next.Invoke();'替換** Core 1.0 ** –

+0

@shittu感謝您的更新。 –

3

首先的構造函數的附加參數,你必須包

"Microsoft.AspNetCore.Session": "1.0.0" 

添加爲project.json的依賴。在Startup.ConfigureServices你要添加的服務

services.AddSession(); 

,並在方法來配置你必須使用它(重要:UseMvc之前調用)

app.UseSession(); 

現在你可以在你的控制器使用它(如果派生自控制器)。你可以存儲

var data = new byte[] { 1, 2, 3, 4 }; 
HttpContext.Session.Set("key", data); // store byte array 
HttpContext.Session.TryGetValue("key", out data); // read from session 

當您導入的命名空間Microsoft.AspNetCore.Http那麼你可以使用SetStringSetInt32爲好。

using Microsoft.AspNetCore.Http; 

HttpContext.Session.SetString("test", "data as string"); // store string 
HttpContext.Session.SetInt32("number", 4711); // store int 

int ? number = HttpContext.Session.GetInt32("number"); 

控制器外,您沒有訪問HttpContext的,但你可以像在這個answer