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

如何在托管的.NETMVC网站的数据库中存储会话状态Share

时间:2023-04-10 23:39:52 C#

如何在托管的.NETMVC网站的数据库中存储会话状态.当我使用IIS-Express在本地运行站点时,超时时间很长。网站发布到主机(GoDaddy)后,登录超时时间会下降到荒谬的时间长度(约10-15分钟)。我正在使用表单身份验证。登录时我使用标准:FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe);然后在我的控制器中我使用Authorize属性:[Authorize]publicclassBillingAccountController:Controller{...}我尝试了几个涉及解决方案来更改web.config设置。此时,我有下面这行来延长超时时间:………………但这行不通。似乎被主人忽略了。我见过一些更改IIS7设置的解决方案,但由于这是托管,我认为我无法访问它。(我检查了我的GoDaddy仪表板,虽然有一个IIS菜单,但它非常有限。)该网站已经存在了大约4个月,并且一直受到客户的抱怨。如果有帮助,我正在使用自定义角色和成员资格提供程序。我只使用FormsAuth来创建和授权authcookie。在这一点上,我对另一种登录解决方案持开放态度。如果必须删除表单身份验证。我可以想象一些变通办法,比如用自定义属性创建我自己的cookie,或者以某种方式扩展会话,或者放弃cookie并使用数据库,某种定期的AJAX调用搜索第3方解决方案,等等……客户希望我做某事-引用-“永远”忘记。我不确定这是正确的答案。但是,如果我至少能让它在一两个小时不活动后超时,我想他们会很高兴,因为10-15次超时真的很烦人。最重要的问题是:我怎样才能延长会话/登录超时时间,如果我不能因为主机的原因,最好的方法是什么?更新阅读@DouglasThomas提供的资源后,我更新了web.config以使用SQLServer会话:使用连接字符串:这似乎无法解决问题。用户登录仍会在不到20分钟内完成。虽然,我确实有一个问题:SQLServer会话是否需要在SQL数据库端进行任何配置?或者只是web.config的变化?我读过的文档不清楚。更新2我已经根据@DaveA的建议更新了我的解决方案。但它似乎仍然没有用。我已经使用asp会话状态数据库配置了SQLServerExpress。我使用此Microsoft文档作为指南,首先重新配置服务器设置(SQLExpress需要),然后使用以下命令行:aspnet_regsql.exe-ssadd-sstypep-SSERVERPCSQLEXPRESS-E在ASP状态数据库。成功创建了一个包含多个表和大量存储过程的新数据库。然后我更新了web.config中的sessionState节点:但它似乎对登录持续时间没有任何影响。我什至无法判断它是否已连接到数据库,因为没有新记录填充ASPStateDB中的表。我会注意到我没有在Web应用程序的任何地方明确使用会话变量。我假设表单身份验证应该以某种方式使用它们。解决方案经过与@DaveA的共同努力,他在www.asp.net论坛上找到了一篇文章,其中有人遇到了同样的问题:http://forums.asp.net/t/1967093.aspx?Forms+authentication+session+timeout+problems+after10+minutes按照@DaveA的建议,我在我的web.config(我从这里生成)中添加了一个machineKey部分。在现场上传和测试后,用户登录在20多个小时不活动后仍然存在。所以我相信机器密钥是我的答案。问题是:您正在尝试将已定义的连接字符串与SessionStateProvider一起使用。这是非常合乎逻辑的,但是行不通,因为SessionStateProvider仍然使用ASP.NET1.0中的原始定义,而ConnectionStrings是在ASP.NET2.0中引入的。这是微软从未修复过的奇怪的不一致。为了设置DBSession状态:1)在定义SessionState时使用完整的连接字符串非常重要:在登录方法中设置cookieless="true"并确保rememberme=false。这些步骤对于防止框架将cookie用于会话状态很重要。2)在sqlserver上创建模式:aspnet_regsql.exe-ssadd-d-sstypec-S-U-P3)在web.config中设置机器密钥属性,将会话和成员资格绑定到主机:形成交叉虚拟身份验证到目录http://aspnetresources.com/tools/machineKey请记住:为会话使用数据库会带来很高的性能成本,并且(正如您所注意到的)所有参数传递都很麻烦。这远非完美的解决方案。由于负载平衡,共享帐户通常会导致会话出现问题。在这种情况下,最好转向使用cookie。您更大的问题似乎是GoDaddy出于安全原因限制会话超时(cookie和会话)的共享托管策略。如果性能成为问题,您可能需要更改托管计划。机器密钥:用于将成员资格绑定到域。当机器密钥匹配时,成员资格可以跨多个域共享。即使没有数据库会话(值得一试),这也可能会有所不同。您不能在共享主机环境中使用会话,因为它会影响该服务器上的其他站点。可以使用ASP.NETsessionstate作为替代方案,请参考上面的C#学习教程:HowtostoreSessionstateinthedatabaseforahosted.NETMVCwebsite分享所有内容,如果对大家有用的话和需要了解更多C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: