这是一个相当模糊的问题,因为我在生产Web服务器之外复制我的问题时运气不佳,不确定我的两个问题是否相关。
我的应用程序服务器运行的是Windows Server 2003,面向公众。ASP.NET Web应用程序在.NET 3.5中运行,并在LAN上使用(私有)SQL Server(2008)。运行SQL Server的服务器还托管SQL Server Reporting Services,该服务通过包含MS ReportViewer控件的页面在我们的Web应用程序中使用。
该应用程序以前是针对.NET 1.1运行的,去年迁移到了3.5。数据库是SQL Server 2000,今年早些时候在一个单独的版本中进行了更新。
我在我们的部署中遇到了两个奇怪的问题
必须
以配置为基础,但我已经没有嫌疑犯了。
这两个问题都与用户会话丢失有关。
第一次发生在报告中,并在ReportViewer控件中触发。很少情况下,我们的用户会试图操纵一个报表(我发现了一个针对特定用户和报表组合的可复制案例——当我尝试更改报表页面时,总是抛出一个异常)。
异常调用堆栈如下所示:
Microsoft.Reporting.WebForms.aspNetSessionExpiredException:ASP.NET会话已过期或找不到
在Microsoft.Reporting.WebForms.ViewerDaoOperation..ctor()上
在Microsoft.Reporting.WebForms.ReportDataOperation..ctor(Boolean RequiresFullReportLoad)
在microsoft.reporting.webforms.httphandler.gethandler(string operationtype)上
在Microsoft.Reporting.WebForms.httpHandler.ProcessRequest(httpContext上下文)
在system.web.httpapplication.callHandlerExecutionStep.system.web.httpapplication.ieExecutionStep.Execute()上
在system.web.httpapplication.executeStep(iexecutionStep步骤,布尔值&同步完成)
Web应用程序被配置为使用Inproc状态存储,因此第二个IIS进程将无法定位用户的会话-根据我读过的一些博客,这通常就是这个异常的含义。
我可以看到IIS向另一个工作进程收集额外的请求…但站点配置为使用单个进程。这个异常不应该被抛出-因此,要么是IIS GUI工具对我撒谎,说Web应用被配置为单进程,要么是异常消息没有描述真正的问题。
我在IIS中创建了一个新的应用程序池,配置为每10000个请求以及凌晨2点回收工作进程。(10000请求规则是解决可能存在或可能不存在的问题的老方法-问题及其相关信息早于我,我不想尝试它)
在“性能”选项卡中,最大工作进程数设置为1。
我能想到的唯一解决方法是遵循ReportViewer用户所说的,即将状态服务器模式从InProc切换为使用进程外序列化模型。我选择了ASP.NET状态服务器。
除了生产服务器,它在每台服务器上都可以正常工作。当我在生产中打开它时,每个用户都有这样的体验:
1)点击登录页面,输入凭证,登录
2)单击主页上的任何链接
3)重新启动以登录屏幕。重新输入凭据,登录。
4)在用户注销之前,该站点现在工作正常。
同样,这个问题只存在于那个生产服务器上,在我的开发人员机器、测试服务器或公共演示服务器上是不可复制的。
他们有关系吗?也许,也许不是。由于可用的诊断信息太少,我几乎没有什么想法。如果有人碰到了这样的事情,或者有了一条新路的想法,我会非常感激的。