Asp.net mvc 4 一旦部署到IIS 7(W 2008 R2),ASP.NET MVC 4 Web应用程序中的会话对象为空
我开发了一个ASP.NET MVC 4 web应用程序(.NET 4.5),它在Visual Studio 2012中运行良好。在Windows Server 2008 R2上部署到IIS 7后,控制器中的HttpContext.Session对象似乎为空。我创建了一个简单的测试ASP.NETMVC4应用程序来演示这个问题 在我的测试应用程序中,我有一个简单的家庭控制器Asp.net mvc 4 一旦部署到IIS 7(W 2008 R2),ASP.NET MVC 4 Web应用程序中的会话对象为空,asp.net-mvc-4,iis-7,Asp.net Mvc 4,Iis 7,我开发了一个ASP.NET MVC 4 web应用程序(.NET 4.5),它在Visual Studio 2012中运行良好。在Windows Server 2008 R2上部署到IIS 7后,控制器中的HttpContext.Session对象似乎为空。我创建了一个简单的测试ASP.NETMVC4应用程序来演示这个问题 在我的测试应用程序中,我有一个简单的家庭控制器 public class HomeController : Controller { public ActionRes
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>
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, Bar(Session)));
但在我将应用程序部署到web服务器后,网站会显示以下页面,指示会话对象为空:
Index
This is a simple test
beeeeuuuuu - Session = null!!!
web应用程序部署到默认网站,该网站在ASP.NET v4.0应用程序池(集成管道)下运行
我已经使用aspnet_regiis-ir在服务器上重新安装了ASP.NET,但这没有帮助。会话状态在ISS服务器上启用(在Proc中)。我希望这里有人能帮我,因为我一直在努力解决这个问题
非常感谢,并致以亲切的问候
更新:我还用.NET4.0而不是4.5测试了一个ASP.NETMVC4版本,这也有同样的问题。我还部署了一个ASP.NET Web Pages应用程序(.NET 4.0),运行良好(HttpContext.Current.Session在代码隐藏中不为null)
更新II:我还尝试将会话状态存储在数据库中,该数据库在我的开发机器上运行良好,但在生产服务器上存在相同的问题(HttpContext.Session仍然返回null)。我找到了解决方案。您必须添加和删除SessionStateModel:
<configuration>
...
<system.webServer>
...
<modules>
<remove name="Session" />
<add name="Session" type="System.Web.SessionState.SessionStateModule"/>
...
</modules>
</system.webServer>
</configuration>
...
...
...
我不知道Microsoft为什么不将此添加到项目模板的web.config中?我在部署我的应用程序时,以为我的控制器中的
会话
为空,但我错了。结果我错过了兰姆达表情的微妙之处。虽然这不是提问者的解决方案,但这个问答在搜索中排名很高,所以我希望这个答案可以为其他人节省一些时间
我的控制器最初包含如下内容:
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
This is a simple test
<p>@ViewBag.Info</p>
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, Bar(Session)));
Bar
是一个从会话获取值的静态方法,它正在抛出一个NRE试图访问其参数。我按如下方式更改了控制器代码,一切正常:
var bar = Bar(Session);
HostingEnvironment.QueueBackgroundWorkItem(ct => Foo(ct, bar));
神秘的是,为什么在我的本地机器上测试时,原始代码始终有效 iis中的会话状态是否已禁用?iis上没有启用任何会话状态,并且设置为InProc会话状态。我寻找此解决方案已有数小时,+1从未发现需要删除和添加此解决方案。可能是MVC4+IIS7的某些特殊性。。。这对我有用+1.