2017-02-20 68 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(); 
}