这是一个非常模糊的问题,因为我没有运气在我们的生产网络服务器之外复制我的问题,我不确定我的两个问题是否相关.
我的应用程序服务器正在运行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 session has expired or could not be found
at Microsoft.Reporting.WebForms.ViewerDataOperation..ctor()
at Microsoft.Reporting.WebForms.ReportDataOperation..ctor(Boolean requiresFullReportLoad)
at Microsoft.Reporting.WebForms.HttpHandler.GetHandler(String operationType)
at Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Web应用程序配置为使用InProc状态存储,因此第二个IIS进程将无法找到用户的会话 – 这就是这个异常通常意味着什么,根据我读过的一些博客.
我可以看到IIS将其他请求汇集到另一个工作进程…除了站点配置为使用单个进程.不应抛出此异常 – 因此IIS GUI工具对我来说是关于将Web应用程序配置为单进程,或者异常消息未描述真正的问题.
我在IIS中创建了一个新的应用程序池,它被配置为每10000个请求以及凌晨2点回收工作进程. (10000请求规则是解决可能存在或可能不存在的问题的旧解决方案 – 关于它的问题和信息早于我,我不倾向于尝试它)
在性能选项卡中,最大工作进程数设置为1.
我能想到的唯一解决方法是遵循ReportViewer用户所说的内容,即将状态服务器模式从InProc切换为使用进程外序列化模型.我选择了ASP.NET状态服务器.
除了生产之外,它在每个服务器上运行良好.当我在制作时打开它,每个用户都有这样的经历:
1)点击登录页面,输入凭据,登录
2)单击主页上的任何链接
3)重新登录登录屏幕.重新输入凭据,登录.
4)该站点现在正常工作,直到用户注销.
再一次,这个问题只存在于该生产服务器上,并且在我的开发机器,我们的测试服务器或我们的公共演示服务器上无法重现.
它们有关系吗?也许,也许不是.由于缺乏可用的诊断信息,我几乎没有什么想法.如果有人发现这样的事情,或者想到一条新的道路我可以走下去,我真的很感激.
最佳答案 我能够解决这两个问题.
第二个问题(必须登录两次)不再可重现.我尝试重新注册ASP.NET(aspnet_regiis),同时尝试修复它的另一个修复,或者另一个不相关的配置更改.
主要问题是ReportViewer控件中的错误.无论出于何种原因,ASP.NET开始记录导致我报告的异常的更多异常,并且我得到了一个根本原因的暗示,这在此Connect问题中有所概述:
我也在那里发布了一个解决方法.这是为ReportViewer提供信息的Web服务中的一个错误.该错误仅被非IE浏览器绊倒.