首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >一旦部署到IIS7 (W 2008 R2),ASP.NET MVC4Web应用程序中的会话对象为空

一旦部署到IIS7 (W 2008 R2),ASP.NET MVC4Web应用程序中的会话对象为空
EN

Stack Overflow用户
提问于 2013-07-30 21:10:36
回答 2查看 15.4K关注 0票数 4

我开发了一个ASP.NET MVC4Web应用程序(.net 4.5),它在Visual Studio2012中运行良好。在Windows Server2008 R2上部署到IIS7之后,我的控制器内部的HttpContext.Session对象似乎是空的。我创建了一个简单的测试ASP.NET MVC4应用程序来演示这个问题。

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

代码语言:javascript
复制
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视图如下所示:

代码语言:javascript
复制
@{
    ViewBag.Title = "Index";
}

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

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

代码语言:javascript
复制
Index
This is a simple test 
a string in session state

但在我将应用程序部署到web服务器后,网站给出了以下页面,表明会话对象为空:

代码语言:javascript
复制
Index
This is a simple test 
beeeeuuuuu - Session = null!!!

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

我已经使用aspnet_regiis -ir在服务器上重新安装了ASP.NET,但这并没有帮助。在ISS服务器上启用(在进程中)会话状态。我希望任何人能在这里帮助我,因为我正在努力解决这个问题很长一段时间。

非常感谢,并致以亲切的问候。

更新:我还测试了使用.NET 4.0而不是4.5构建的ASP.NET MVC4,它也有同样的问题。我还部署了一个ASP.NET网页应用程序(.NET 4.0),它工作得很好(后面的代码中的HttpContext.Current.Session不是空的)。

更新II:我还尝试将会话状态存储在数据库中,这在我的开发机器上工作得很好,但在生产服务器上也有同样的问题(HttpContext.Session仍然返回null)。

EN

回答 2

Stack Overflow用户

发布于 2013-07-31 19:59:19

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

代码语言:javascript
复制
  <configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

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

票数 28
EN

Stack Overflow用户

发布于 2019-06-11 03:04:10

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

我的控制器最初包含如下内容:

代码语言:javascript
复制
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, Bar(Session)));

Bar是一个从会话中获取值的静态方法,它抛出了一个试图访问其参数的NRE。我修改了我的控制器代码,如下所示,一切正常:

代码语言:javascript
复制
var bar = Bar(Session);
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, bar));

令人费解的是,为什么在我的本地机器上测试时,原始代码还能正常工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17947975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档