由SharePoint 2010的Session引发的Access Violation异常
一个客户的SharePoint w3wp.exe经常crash, 抓来的dump里一堆Access Violation(AV)的mini dump, 最后是一个terminate process的full dump.
配置了一个ADPlus的config文件, 抓来了AV的full dump.
发现是由于客户自己写的这样一段代码抛出了AV异常.
HttpContext.Current.Session["Dummy"] = "1";
明显这是由于HttpSessionState对象为空导致的异常. 那么为什么这个SharePoint 2010 Web application中的HttpSessionState拿不到呢?
答案是因为SharePoint 2010和SharePoint 2007中, ASP.NET Session State都是默认关掉了的.
AsiaTech: Microsoft APGC Internet Developer Support Team发表了一篇文章, 描述了发生在MOSS 2007中的类似问题的解决方案. 那么SharePoint 2010里, 这篇文章的解决方案是否适用呢?
答案是不完全. SharePoint 2010中要想使用ASP.NET Session State的话, 需要开启SharePoint Server ASP.NET Session State Service这个service application. 而这个service application在界面上是无法开启的, 必须通过powershell.
开启的命令如下:
Enable-SPSessionStateService –DefaultProvision
如果想把session state的数据库放到另外的数据库服务器中, 可以变换命令的参数, 如下:
Enable-SPSessionStateService -DatabaseServer YourDBServerName -DatabaseName YourDBName
运行上面的命令之后, 已创建的web application的web.config会被自动添加如下的两行:
<sessionState mode="SQLServer" timeout="60" allowCustomSqlDatabase="true" sqlConnectionString="Data Source=sql;Initial Catalog=SessionStateService_b61bfc5803714dad8a5b86e820e42e0e;Integrated Security=True;Enlist=False;Connect Timeout=15" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
有了Session State Service Application, 要在某个web application中开启session state, 你还得修改它的web.config文件, 把false改为true如下:
好了, 这样改过之后, 这种AV的错误就不会再出现了.
参考资料
===========================
Enable ASP.NET Session State on SharePoint 2010 Application
Using Session State in SharePoint 2010
http://blogs.msdn.com/b/markarend/archive/2010/05/27/using-session-state-in-sharepoint-2010.aspx