2017-02-20 220 views
0

訪問上下文的Session屬性會引發異常,因爲會話未配置。在ASP.NET Core 1.0中檢查會話

如何檢測會話是否可用,如果它可以打開或關閉取決於配置。

換句話說,我不能做到這一點:context.Session?.Clear();

+0

你沒有運行'services.UseSession()'基於配置? – DavidG

+0

我假設你試圖建議直接從配置中獲取它..老實說,配置不是我真正擁有的東西......我只是說配置來解釋會話是可選的......實際上原因有點兒不同的...會話可以稍後使用..但代碼應該現在已經考慮它。 – Maxim

回答

3

我認爲最安全和最高效的方式是使用request features。例如,這裏有一個簡單的擴展方法來獲取會話或空,如果它未啓用:從MVC控制器

public static ISession SafeSession(this HttpContext httpContext) 
{ 
    var sessionFeature = httpContext.Features.Get<ISessionFeature>(); 
    return sessionFeature == null ? null : httpContext.Session; 
} 

用法示例:

var session = this.HttpContext.SafeSession(); 
+0

是的,我同意..至少這是我現在要做的。))我認爲你是對的,我們可以接受這個答案。此外,我認爲你可以更新它爲「this.HttpContext」來澄清它是實例(甚至語法突出認爲錯誤)。 – Maxim

+0

嗯,我假設這種方法是在一個控制器,甚至可能在一個基本的控制器類,以便輕鬆訪問所有的人。事實上,它可能會更好地作爲擴展方法... – DavidG

0

哈克的解決辦法,但可能足以讓你繼續工作,直到一個更好的解決方案中找到。

public class Startup 
{ 
    public static bool IsSessionAvailable { get; set; } 
    //... 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     IsSessionAvailable = false; // session not available 

    //... 

然後在你的控制器中。

if (Startup.IsSessionAvailable) 
{ 
    HttpContext.Session.Clear(); 
}