当前位置: 首页 > 编程语言 > C#

为什么我不能使用StateServer在两个Web应用程序之间共享会话状态?我错过了什么?分享

时间:2023-04-10 11:56:37 C#

为什么我不能使用StateServer在两个Web应用程序之间共享会话状态?我错过了什么?我无法让两个相同的ASP.NETMVC应用程序使用SessionStateServer共享同一个会话。我尝试这样做的原因是我们最终将在需要共享相同状态的3个Web服务器上部署此应用程序。我们需要使用StateServer,因为我们试图尽量减少数据库对非数据相关存储的使用。设置:我已经将相同的代码库部署到http://localhost/App1和http://localhost/App2都有相同的Web.Config文件,内容如下://stateConnectionString="tcpip=192.168.1.52:42424"/>//也不起作用我使用此工具生成这些机器密钥检查:我将以下内容放入我的一个控制器中以测试它是否有效:ViewData["mode"]=requestContext.HttpContext.Session.Mode。字符串();字符串时间戳=DateTime.Now.ToString();if(requestContext.HttpContext.Session["timestamp"]==null){requestContext.HttpContext.Session["timestamp"]=timestamp;}ViewData["timestamp"]=requestContext.HttpContext.Session["timestamp"].ToString();ViewData["realtime"]=时间戳;在视图中有这个:模式:时间:实时:结果:对于这两个部署,当页面首次加载时,我可以看到模式是StateServer并且时间戳设置为与实时值相同的时间。但是如果你这样做,只有第一页应该有相同的时间实时值。第二个页面加载应该从StateServer读取,因为该时间戳值不再为空,并显示该时间值。但相反,它再次显示了实时价值。刷新页面时,时间戳保持不变,实时值始终更新。这表明时间戳正在保存到会话中,但是当两个部署应该相同时,时间戳值总是不同的,所以这表明会话没有被共享。有人可以指出我是否做错了什么,或者我还需要做些什么才能让它发挥作用?谢谢默认情况下,会话不能在不同的应用程序之间共享。据我所知,您有两个不同的应用程序,App1和App2,在不同的虚拟目录中运行,甚至可能在不同的应用程序池中运行,因此不要期望在它们之间共享会话。与往常一样,您可能会发现一种有用的解决方法。如您所见,它使用hack(反射)来绕过ASP.NET团队的设计人员决心不公开某些类和属性并让我们的生活变得困难。实际上,你可以使用Sqlserver模式共享session。试试这个:-我只是修改了程序,即USEASPStateGOALTERPROCEDUREdbo.TempGetAppID@appNametAppName,@appIdintOUTPUTAS--startchange--如果指定,使用连接中指定的应用程序名称作为appname--这允许我们通过确保它们在连接字符串中具有相同的应用程序名称来在站点之间共享会话。DECLARE@connStrAppNamenvarchar(50)SET@connStrAppName=APP_NAME()--.NETSQLClientDataProvider是.NET应用程序的默认应用程序名称IF(@connStrAppName'.NETSQLClientDataProvider')SET@appName=@connStrAppName--结束更改SET@appName=LOWER(@appName)SET@appId=NULLSELECT@appId=AppIdFROM[ASPState].dbo.ASPStateTempApplicationsWHEREAppName=@appNameIF@appIdISNULLBEGINBEGINTRANSELECT@appId=AppIdFROM[ASPState.dbo.ASPStateTempApplicationsWITH(TABLOCKX)WHEREAppName=@appNameIF@appIdISNULLBEGINEXECGetHashCode@appName,@appIdOUTPUTINSERT[ASPState].dbo.ASPStateTempApplicationsVALUES(@appId,@appName)IF@@ERROR=2627BEGINDECLARE@dupApptAppNameSELECT@dupApp=RTRIM(AppName)FROM[ASPState].dbo.ASPStateTempApplicationsWHEREAppId=@appIdRAISERROR('SQL会话状态致命错误:应用程序“%s”和“%s”之间的哈希码冲突。请重命名第一个应用程序以解决问题。',18,1,@appName,@dupApp)ENDENDCOMMITENDRETURN0GO然后将web.config修改为:-您必须添加应用程序名称,并且对于要共享同一会话的所有应用程序,它必须相同谢谢。更新:这是我之前回答过的关于使用ASP.NET会话状态服务跨应用程序共享会话的同一主题的帖子正如已经指出的那样,会话数据的范围是应用程序。这是您在IIS中创建的应用程序。因此,由于应用程序范围的原因,具有相同会话ID的两个应用程序不会共享同一个会话。作为另一种想法,它可能对您有用,也可能不适合您。您可以创建一个根应用程序并将代码放在两个子文件夹D:App1和D:App2中。d:Rootweb.configApp1default.aspx...App2default.aspx...然后在IIS中创建一个指向d:Root的应用程序。也可以在IIS中创建应用程序,然后在应用程序下创建两个虚拟目录,一个指向D:App1,一个指向D:App2,那么它们也可以共享一个应用程序级别的web.config。至关重要的是,这两个虚拟目录都只是虚拟目录,而不是作为应用程序创建的。所以硬盘布局可能看起来像这样D:Rootweb.configD:App1default.aspx...D:App2default.aspx...创建一个指向D:Root的根应用程序,然后创建一个指向D:Root下Applications:App1的两个虚拟目录App1和App2指向D:App2。在这两种情况下的效果是,您有效地将一个应用程序分成两部分,都在相同的Session范围内,因此两者的代码可以共享相同的会话数据。您还必须确保两个Web服务器上的应用程序的应用程序路径必须相同。这是一篇可能有帮助的旧文章http://support.microsoft.com/default.aspx?scid=kb;EN-US;q325056我们目前遇到类似的问题,除了我们使用的是IIS7.5并且我们有应用程序隐藏的程序路径(不再使用元数据库)。有谁知道使用IIS7.5解决此问题的方法吗?以上是C#学习教程:为什么我不能使用StateServer在两个Web应用程序之间共享会话状态?我错过了什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: