好。 所以基本上我正在研究网页上的消息系统。 我的网页上的用户能够发送彼此的消息,但现在我希望消息在发送时在接收器屏幕上“弹出”。就像Facebook上的某个人在你上网时给你发了一条消息一样,这个消息变成了红色。为了解决我的问题,我需要每个客户知道目前哪些其他客户在线。我通过在Global.asax中编写类似Observer的模式来解决这个问题:
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,我已经做了扩展Observer类:
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完美更新,但在接收方没有任何反应。反正不在UpdatePanel中。 因为如果我更改Update()中的代码以运行来自DB的消息,我可以看到消息被调用正常,并且加载了新消息。刚刚没有更新到UpdatePanel。 所以我一直在思考为什么更新面板在数据更新时没有在“接收器”端更新,我的结论是因为在“接收器”端没有部分回发。是的,Update()方法被调用,但没有回发。所以我的问题是: 是否有可能从代码隐藏中“强制”部分帖子?或者是否有其他可能更好的解决方案?
希望有道理: - )
答案 0 :(得分:1)
答案 1 :(得分:0)
我不是使用updatepanels的忠实粉丝,但我认为你可以使用timer-control来强制部分回发。
查看:http://mattberseth.com/blog/2007/08/using_the_ajax_timer_control_a.html
答案 2 :(得分:0)
我不是专家,但您可以尝试与SetTimeout
(.svc)关联的Javascript / Jquery WebService
函数来定期从客户端请求并从服务器检索数据。< / p>
答案 3 :(得分:0)
那些解决方案,彗星等会起作用,但最好的办法是使用socket.io Real Time Browser Applications 你也可以把它与backbone.js结合起来,并有一个非常好的应用程序。我帮助基于这些2创建了一个实时网络信使。