由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如下:

image

image

好了, 这样改过之后, 这种AV的错误就不会再出现了.

参考资料

===========================

Enable ASP.NET Session State on SharePoint 2010 Application

http://nikspatel.wordpress.com/2012/02/12/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

原文地址:https://www.cnblogs.com/awpatp/p/2599006.html