使用我们当前的设置,需要在两个站点之间维护镜像会话,一个现有的ASP.NET网站在IIS 6.0中托管,现在在iFrame中包含新网站,并且单独托管在IIS 7.5中(它是MVC3)
有没有人建议如何让父会话与子网站会话保持一致?
我最初的想法是创建一个ActionFilter来将HttpWebRequest触发到OnActionExecuting方法上父站点上的各种HTTPHandler。人们一直怀疑这会如何使特定会话保持内联,或许缺少有关会话ID的知识?
类似的东西:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
var request = WebRequest.Create(
ConfigurationManager.AppSettings["HeartbeatURI"]);
using (var webResponse = request.GetResponse())
{
var response = webResponse as HttpWebResponse;
if (response != null && response.StatusCode == HttpStatusCode.OK)
{
有人在这里有任何建议/意见吗?谢谢!
更新
在提出一些有用的建议之后,我将调查是否有来自浏览器的解决方案,例如:
function setHeartbeat() {
setTimeout("heartbeat()", 300000); // every 5 min
}
function heartbeat() {
$.get(
"http://soemthing:1234/heartbeathandler.ashx",
null,
function(data) {
setHeartbeat();
},
"json"
);
}
将按照我的要求执行。
答案 0 :(得分:1)
您的代码示例未考虑两个基本问题:
首先,会话是每个客户端。此解决方案尝试“心跳”来自辅助服务器的单个连接。所以它不会起作用。
其次,会话需要通过cookie或特殊的额外URL值进行客户端交互。此解决方案不会尝试合并这些,因此根本不会创建任何会话。
编辑:还有第三个问题:进程中的会话无法保证活着无论你做什么;应用程序可以随时回收,应用程序回收将擦除进程内会话值。因此,您需要拥有一些外部会话管理系统,以便维护会话(在两个服务器上)。
但是真的;尝试保持这样的会话是非常脆弱的。听起来它对你的应用程序非常重要,但几乎不能保证它会一直运行。重新认识您的应用程序不需要会话,或者能够动态重建它们,将是一个更好的选择,IMO。