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

使用asp.net和状态服务器在两个网站之间共享会话分享

时间:2023-04-10 16:00:34 C#

C#学习教程:使用asp.net和状态服务器在两个网站之间共享会话ASP.NET状态服务在我的机器上运行,web.config在两个站点中更新,代码如下:允许远程连接在注册表中设置为1,以便第二个网站访问状态服务器。两个网站都有相同的机器密钥:此外,两个站点都在IIS中配置为具有相同的标识符。我想做的是这两个站点共享相同的会话数据,例如能够执行以下操作://在网站1:Session["key"]="value"和//在网站2://从其他网站读取会话值stringresult=Session["key"]问题是我无法完成这个测试,真的无法理解我做错了什么。任何可能有帮助的想法?您需要一种方法让您的浏览器无论访问哪个站点都发送相同的ASP.NET会话cookie。如果请求中不存在cookie,将使用该密钥创建一个新会话。我认为您可以让浏览器通过一些偷偷摸摸的DNS配置来保存密钥-如果您指定http://website1.mydomain.com/和http://website2.domain.com/作为您站点的地址,那么ASP.NET会话cookie的域设置为“domain.com”,然后您的浏览器将其发送到两个站点,并且应该共享会话。您还可以在ASP.NET中使用cookieless模式,并从生成的URL中获取会话ID。我知道这个问题在5年前就得到了回答,但今天我想我可以提供更多信息。首先,这不是在两个IIS应用程序之间共享会话数据的官方方式,也不是最流行的方式。“看似官方”的方式是使用SQLServer会话。如果您出于任何原因不能使用SQL服务器,那么我们可以稍微调整IIS应用程序,以便我们可以使用进程外会话,即StateServer会话状态模式。为此,需要做一些事情:2.应用程序的会话cookie必须设置在同一域中。例如必须匹配机器密钥。您可以进行标准的Web.config字段加密以使其更安全,但这是可选的。会话状态模式设置为状态服务器将(1)、(2)、(3)放在一起:...必须与应用程序名称匹配。如果不是,则只能共享会话ID,不能共享会话数据。问题是您不能在Web.config中配置应用程序名称。但是,我们可以创建自己的配置并通过反射注入它。只需要将以下代码放在Global.asax.cs中:publicoverridevoidInit(){base.Init();try{//从配置文件中获取应用名称...stringappName=ConfigurationManager.AppSettings["ApplicationName"];if(!string.IsNullOrEmpty(appName)){foreach(stringmoduleNameinthis.Modules){IHttpModulemodule=this.Modules[moduleName];SessionStateModulessm=模块作为SessionStateModule;if(ssm!=null){FieldInfostoreInfo=typeof(SessionStateModule).GetField("_store",BindingFlags.Instance|BindingFlags.NonPublic);SessionStateStoreProviderBasestore=(SessionStateStoreProviderBase)storeInfo.GetValue(ssm);if(store==null)//在IIS7Integrated模式下,稍后调用module.Init(){FieldInforuntimeInfo=typeof(HttpRuntime).GetField("_theRuntime",BindingFlags.Static|BindingFlags.NonPublic);HttpRuntimetheRuntime=(HttpRuntime)runtimeInfo.GetValue(null);FieldInfoappNameInfo=typeof(HttpRuntime).GetField("_appDomainAppId",BindingFlags.Instance|BindingFlags.NonPublic);appNameInfo.SetValue(theRuntime,appName);}else{输入storeType=store.GetType();如果(storeType.Name.Equals("OutOfProcSessionStateStore")){FieldInfouribaseInfo=storeType.GetField("s_uribase",BindingFlags.Static|BindingFlags.NonPublic);uribaseInfo.SetValue(storeType,appName);}}}}}}catch(Exceptionex){log.Error(ex.Message,ex);积分归于pfemiani,李晨,我不记得是谁在代码项目的评论中把它放在一起请注意,pfemiani的回答对我不起作用,但将它与李晨的帖子结合起来。确保ASP.NET状态服务正在运行。这是现在保存会话数据的地方。两个asp.netwebapplications之间的sharingsession可以参考下面的urlhttp://www.freshcodehub.com/Article/48/sharing-session-between-two-aspnet-web-applications以上是C#的学习教程:使用asp.net和stateserver实现两个网站session共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: