部署到IIS 7后,ASP.NET MVC 4 Web应用程序中的Session对象为空(W 2008 R2)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (58)

我开发了一个ASP.NET MVC 4 Web应用程序(.net 4.5),它在Visual Studio 2012中运行良好。在Windows Server 2008 R2上部署到IIS 7后,我的控制器中的HttpContext.Session对象似乎为null。我创建了一个简单的测试ASP.NET MVC 4应用程序来演示该问题。

在我的测试应用程序中,我有一个简单的Home Controller

public class HomeController : Controller
{
    public ActionResult Index()
    {
          if ( HttpContext != null && HttpContext.Session != null )
          {
              HttpContext.Session[ "test" ] = "a string in session state";
              ViewBag.Info = HttpContext.Session[ "test" ];
              return View();
          }
          else
          {
              if ( HttpContext == null )
              {
                  ViewBag.Info = "beeeeuuuuu - HttpContext = null!!!";
              }
              else if ( HttpContext.Session == null )
              {
                    ViewBag.Info = "beeeeuuuuu - Session = null!!!";
              }
              return View();
          }

    }
}

我的Index.chtml视图看起来像这样:

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
This is a simple test
<p>@ViewBag.Info</p>

因此,当我运行应用程序时,我得到了我所期望的:

Index
This is a simple test 
a string in session state

但在我将应用程序部署到Web服务器之后,该网站向我提供了以下页面,指示Session对象为null:

Index
This is a simple test 
beeeeuuuuu - Session = null!!!

Web应用程序部署到默认网站,该网站在ASP.NET v4.0应用程序池(集成管道)下运行。

我已经使用aspnet_regiis -ir在服务器上重新安装了ASP.NET,但这没有帮助。会话状态在ISS服务器上启用(在Proc中)。我希望有人可以帮助我,因为我试图解决这个问题很长一段时间。

非常感谢提前和亲切的问候。

更新:我还测试了使用.NET 4.0而不是4.5的ASP.NET MVC 4版本,并且具有相同的问题。我还部署了一个ASP.NET网页应用程序(.NET 4.0),并且工作正常(HttpContext.Current.Session在后面的代码中不为null)。

更新II:我还尝试将会话状态存储在一个数据库中,该数据库在我的开发机器上工作正常,但在生产服务器上遇到了同样的问题(HttpContext.Session仍然返回null)。

提问于
用户回答回答于

当我部署我的应用程序时,我认为我的控制器中为空,但错了。事实证明我错过了lambda表达的微妙之处。虽然这不是提问者案例的解决方案,但这个问答在搜索中排名很高,所以我希望这个答案可能会节省一些时间。

我的控制器原来包含这样的东西:

HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, Bar(Session)));

Bar是一个从会话中获取值的静态方法,它正在尝试访问其参数的NRE。我改变了我的控制器代码如下,一切都很顺利:

var bar = Bar(Session);
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, bar));

神秘的是原始代码在我的本地机器上进行测试时的原因!

用户回答回答于

我找到了解决方案。您必须添加和删除SessionStateModule:

  <configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

我不知道微软为什么不将它添加到项目模板的web.config中?

扫码关注云+社区

领取腾讯云代金券