Проблемы с ASP.NET и пользовательскими событиями
-
24-09-2019 - |
Вопрос
У меня возникла проблема при обработке события ReceiveCompleted MessageQueue в ASP.NET.Он успешно его улавливает, но все изменения, примененные к элементам управления страницы, не оказывают никакого эффекта.
Вот что у меня есть:
.ASPX
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Timer ID="Timer1" runat="server" Interval="3000" ontick="Timer1_Tick">
</asp:Timer>
.CS
private static System.Messaging.MessageQueue queue;
private static String messageContent;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
queue = new MessageQueue(@".\Private$\MyQueue");
queue.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
queue.BeginReceive();
}
protected void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
{
System.Messaging.Message message = queue.EndReceive(e.AsyncResult);
message.Formatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String,mscorlib" });
Label1.Text = message.Body.ToString(); //Has no effect. The value updates without problem, but doesn't persist after finishing this method. And the Page doesn't refresh with this new value.
Label2.Text = DateTime.Now.ToString(); //Has no effect too.
Timer1.Interval = 99999; //And this one the same, no effect.
messageContent = message.Body.ToString(); //.. But the value stored in this variable does persist
queue.BeginReceive();
}
Я не понимаю, почему не удается обновить эти переменные.Это может быть всякая ерунда, но я новичок в ASP.NET, поэтому буду рад любой подсказке.
Заранее спасибо!
Пабло
Решение
Вы хотите, чтобы клиентская страница обновлялась командой (вызванной mq_ReceiveCompleted) с сервера, верно?Это невозможно, если это так.
Я предлагаю разместить клиентскую функцию JS, которая будет вызываться по таймеру (примерно каждую секунду) и отправлять асинхронный запрос AJAX веб-службе для получения новых сообщений в MessageQueue.Если такое сообщение существует, JS предпримет все необходимые действия (обновление страницы и т. д.).
Другие советы
Попробуйте установить UpdateMode="Всегда" в свою UpdatePanel или позвоните UpdatePanel1.Update();
в конце mq_ReceiveCompleted() метод.
Убедитесь, что вы обновляете правильный экземпляр объекта страницы.