我有一个ASP.NET MVC工作流配置为由负载均衡器管理的两个网站.这些网站使用Sql Server作为会话状态提供程序,并关闭身份验证(不需要).
现在,偶尔我似乎失去了会话状态,我相信这是因为请求由备用服务器处理,所以基本上用户从服务器跳到服务器,这取决于负载均衡器看起来如何适合.我并不总是在工作流的同一阶段"丢失会话状态",所以我认为它与Web场配置+ sql server会话状态有关.
两个应用程序使用相同的机器密钥来加密和解密存储在sql server中的会话状态.
两台服务器上的配置如下:
<authentication mode="None" />
<sessionState mode="SQLServer" sqlConnectionString="{connection-string}" />
<machineKey decryptionKey="777CB456774AF02F7F1AC8570FAF31545B156354D9E2DAAD"
validationKey="89B5B536D5D17B8FE6A53CBB3CA8B8695289BA3DF0B1370BC47D362D375CF91525DDB5307D8A288230DCD4B3931D23AED4E223955C45CFF2AF66BCC422EC7ECD" />
Run Code Online (Sandbox Code Playgroud)
我已经确认两台服务器上都是一样的,有什么我遗漏的吗?
当我使用单个服务器时,在我的开发环境中不会发生这种情况.
我担心我会受到星期五蓝调的影响,毫无疑问下周会找到答案,遗憾的是我不想等!
有任何想法吗?
我使用命令(aspnet_regsql.exe -S -E -ssadd -sstype p)创建了新的会话数据库,并创建了名为ASPState的DB.然后我将其重命名为E_ASPStateDB.我在sessionState连接字符串中配置了正确的DB名称.但仍然会抛出异常无效的对象名称'ASPState.dbo.ASPStateTempApplications'
我需要做什么,以便它将使用新的数据库名称?
如何在 ASP.NET Core 3 中的两台服务器之间共享会话(负载平衡)?会话可以在多个 Web 服务/API 和主 ASP.NET MVC 应用程序之间共享吗?
我对 .NET Core 3 非常陌生,我习惯于在 ASP.NET Framework MVC 中使用会话状态(它就像在站点的 IIS 配置中使用相同的机器密钥一样简单),但我已经了解到.NET Core 3 的一切都发生了变化,此外,随着新版本的推出,许多文档都非常过时/过时,.NET Core 1 与更高版本无关,2 与 3 无关,而且它需要许多 NuGet 包可能会或可能不会再工作。
目前我已经成功地使用 .NET Core 3 实现了 SQL 会话存储,但是机器密钥的选项不再出现在 IIS 中,我真的不知道如何在appsettings.json文件中配置它们(如果仍然使用的话)。
我们的设置是 2 个服务器,它们必须共享会话信息,使用 F5 负载平衡器,我们使用 .NET Framework MVC 的旧应用程序配置如下,我需要帮助来实现相同的结果,但使用 .NET Core 3。
我通读了https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/web-farm?view=aspnetcore-3.1但它并没有真正解释如何实际做任何事情
还有这个https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-3.1帮助配置了 SQL 会话存储,但不是如何在两台服务器之间共享
c# session-variables session-state sql-session-state .net-core-3.0
所以我使用SQL Server 2008和临时数据库设置SQL Server会话状态,今天我决定只查看表中的数据,以便在ASPStateTempApplications表中找到它:
AppId AppName
538231025/lm/w3svc/1/root
611758131/lm/w3svc/3/root
802488340/lm/w3svc/4/root
-940085065/lm/w3svc/4/root/webapp
685293685/lm/w3svc/5/root
1210055478/lm/w3svc/5/root/webapp
我们有2个负载平衡的Web服务器.
当我查看两个服务器的Web应用程序的ID时,我看到web1的app1的id为4,web2的app1的id为5.同样的事情发生在另一个应用程序中.web1的app2的id为1,web2的app2的id为3.
我的常识告诉我,由于会话ID使用appid,因此Web服务器不会共享会话.我对么?如果是这样,为什么这个小细节在文档中不那么明显?我应该在两个Web服务器上使ID匹配吗?
一组 ASP.NET Web 应用程序共享同一个会话数据库是否更好,还是每个应用程序都应该拥有自己的?
如果没有显着差异,由于更易于维护,最好使用单个数据库。
背景
我的团队有各种各样的 ASP.NET Web 应用程序,它们都是用 Monorail 1.1 或 ASP.NET MVC 1.0 编写的。每个应用程序当前都使用一个专用的会话状态数据库。我正在向该列表中添加一个新站点,并且正在讨论是否应该创建另一个新的会话数据库,或者只是与另一个应用程序共享一个现有的。
这里的Microsoft文档
http://msdn.microsoft.com/en-us/library/h6bb9cz9(v=vs.90).aspx
和几篇SO文章表明,在ASP.NET web.config文件的sessionState声明中指定allowCustomSqlDatabase ="true"将允许我使用默认的ASPState数据库覆盖并指定我自己的数据库名称.
我在web.config文件中设置了这些属性.
<sessionState allowCustomSqlDatabase="true" mode="SQLServer" sqlConnectionString="Data Source=mysqlservername;Initial Catalog=DR_ASPState;Integrated Security=true;Connect Timeout=15;" />
Run Code Online (Sandbox Code Playgroud)
当我尝试调出默认网站页面时,收到一条错误消息,指出无法访问ASPState数据库.
我已使用SQL事件探查器监视SQL流量,并注意到此故障是由此请求引起的:
SELECT @appId = AppId
FROM [ASPState].dbo.ASPStateTempApplications
WHERE AppName = @appName
Run Code Online (Sandbox Code Playgroud)
我已经回收了应用程序池并重新启动了IIS,试图刷新可能存在的任何缓存的数据库名称引用,但这没有帮助.我的理解是ASP.NET SessionState将使用我指定的数据库名称DR_ASPState来生成它用于连接到SessionState数据库的SQL语句.但看起来似乎[ASPState]被硬编码到框架中.
任何人都可以发现我做错的任何事情或提供有关如何解决这个问题的有用的故障排除信息吗?
我正在使用ASP.NET,会话状态存储在SQL Server中的进程外.当页面请求开始时,是否从DB中检索用户会话的全部内容,反序列化并一次性发送到ASP.NET进程,或者仅在需要时将单个对象传输到ASP.NET进程?
基本上,我有一个页面在会话中存储一些大对象,我的应用程序很难确定何时可以处理数据.如果数据仅在使用时从数据库中拉出,则没有问题; 如果为每个页面请求将整个会话状态分块到ASP.NET,我可能会遇到性能问题.
我们已经为我的asp.net应用程序实现了具有SQL服务器会话管理的Web场.有时这个实现工作不正常.
我想知道如何在ASPState数据库中检查会话值(存在于用户),因为我怀疑我的会话不在ASPState数据库中.用户在10次中有2次遇到问题.
我正在为我的 ASP.NET MVC 应用程序实现自定义会话状态提供程序。我的要求是我必须将会话数据存储xml在 Sql 服务器中的自定义表中。
我可以使用现有的sql 会话状态提供程序(覆盖某些方法)还是我必须通过实现抽象类从头开始创建SessionStateStoreProviderBase?
asp.net ×7
asp.net-mvc ×2
sql-server ×2
c# ×1
iis-7 ×1
machinekey ×1
session ×1
sql ×1
web-farm ×1