1

我将应用程序级变量存储在global.asax文件的缓存中:

 void Application_Start(object sender, EventArgs e) 
    {
        Application.Lock();
        List<MyClassName> myobjects = new List<MyClassName>();
        HttpContext.Current.Cache["List"] = myobjects;
        Application.UnLock();        
    }

我访问它并在页面中更改它:

protected void Page_Load(object sender, EventArgs e)
{
   List<MyClassName> myobjects = (List<MyClassname>)HttpContext.Current.Cache["List"];
   //change myobjects...
   HttpContext.Current.Cache["List"] = myobjects;
}

问题是: *假设我们有两个用户(浏览器)同时运行这个站点(例如他们正在聊天)。当一个用户更改myobjects变量时如何通知另一个用户?*

我们可以使用计时器定期检查 myobjects 并将其与旧对象进行比较。但这不是最好的方法。

那么有没有更好的方法在全局变量更改时通知另一个用户?

4

1 回答 1

1

对于网络服务器来说,考虑到 http 协议的无状态性,没有用户或连接用户之类的东西,只是一个请求及其响应。当您说要通知用户时,您是在说服务器将启动不可能的通信。

一个想法可能是,您可以使用长轮询,即保持请求持续存在,并且每当您想向用户通知某些内容时,您都可以输入数据,但它再次不是一个可扩展的解决方案 - 至少对于资源不足的服务器(当然谷歌可以负担得起)

为了通知任何事情,用户必须连接到服务器 - 即必须从客户端发起通信。

另一种选择是使用套接字。您可以编写自定义服务器并让您的 Web 应用程序通知自定义服务器该值已更改。反过来,自定义服务器将使用套接字(Web 套接字)通知客户端。这是一个相当复杂的机制。您可以使用 html 5 提供的 websockets 或使用像 flash/java 这样的插件来进行套接字通信。

于 2012-10-12T13:05:09.357 回答