【发布时间】:2011-08-18 09:25:51
【问题描述】:
好的。 所以基本上我正在网页上的消息系统上工作。 我网页上的用户能够互相发送消息,但现在我希望消息在发送时在接收者屏幕上“弹出”。就像 Facebook 上的某个人在您在线时向您发送消息一样,消息会变成红色。为了解决我的问题,我需要每个客户都知道目前还有哪些其他客户在线。我通过在 Global.asax 中编写类似观察者的模式解决了这个问题:
public static void AddObserver(Observer o)
{
if(!observers.Contains(o))
observers.Add(o);
System.Diagnostics.Debug.WriteLine("Observer tilføjet : " + observers.Count);
}
public static void RemoveObserver(Observer o)
{
if (observers.Contains(o))
observers.Remove(o);
System.Diagnostics.Debug.WriteLine("Observer fjernet : " + observers.Count);
}
public static void NotifyObserversNewMail(Observer observer)
{
foreach (Observer o in observers)
if(!o.Equals(observer))
o.UpdateNewMail();
}
在这种情况下,观察者只是 Site.Master,我已经扩展了观察者类:
public partial class SiteMaster : System.Web.UI.MasterPage, Observer
{
protected void Page_Unload(object sender, EventArgs e)
{
Session["observer"] = this;
Global.AddObserver(this);
}
protected void Page_Load(object sender, EventArgs e)
{
//ADD OBSERVER TO GLOBAL.ASAX
if (Session["observer"] != null)
Global.RemoveObserver((Observer)Session["observer"]);
public void Update()
{
DLMessages.DataSource = ServiceMessages.GetInstance().GetMessages();
DLMessages.DataBind();
UPMessages.Update();
}
其中 DLMessages 是 UpdatePanel UPMessages 中的一个 DataList。
所以我们有一个“发送者”客户端和一个“接收者”客户端。 当发件人创建新消息时,会调用此方法:
protected void MessageSend(object source, EventArgs args)
{
Page.Validate("ValGroupMessageTo");
if (Page.IsValid)
{
ServiceMessages.GetInstance().SendMessage(ServiceCommunity.GetInstance().GetUser(MessageTo.Text).Id, ((User)Session["user"]).Id, MessageMessage.Text);
Global.NotifyObserversNewMail((Observer)Session["observer"]);
ClosePopups(new object(), new EventArgs());
Update();
}
}
您可能会注意到它在 global.asax 上调用 Notify,并直接在其自身上调用 update()。 “发送方”端的 UpdatePanel 更新完美,但接收端没有任何反应。反正不在更新面板中。 因为如果我更改 Update() 中的代码以运行来自 DB 的消息,我可以看到消息被正常调用,并且新消息被加载。只是没有更新到 UpdatePanel。 所以我一直在思考为什么更新面板在数据更新时不会在“接收者”端更新,我的结论是这是因为“接收者”端没有部分回发。是的,当然,Update() 方法被调用,但没有回发。所以我的问题是这样的: 是否可以从代码隐藏中“强制”返回部分帖子?还是有其他更好的解决方案?
希望它有意义:-)
【问题讨论】:
-
您是在尝试将更新从服务器推送到客户端,而没有客户端请求,还是我弄错了?
-
这正是我想要做的......不可能?
-
据我所知。因为客户端不像服务器,它一直在等待请求。客户端发出请求并仅等待响应。
-
因此,例如,当 facebook 使用他们的消息系统执行此操作时,他们有些让客户要求更新?也许在计时器上……?
-
很可能,使用 Javascript/AJAX。
标签: c# .net asp.net updatepanel