Pergunta

Eu tenho um problema ao lidar com o evento recípido de uma mensagem de mensagem no ASP.NET. Ele o captura com sucesso, mas todas as alterações aplicadas aos controles da página não têm efeito.

Isso é o que eu tenho:

.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();
}

Não, não, por que não atualiza esses vars. Pode ser qualquer Nonsense, mas sou novo no ASP.NET, então qualquer pista será bem -vinda.

Desde já, obrigado!

Pablo

Foi útil?

Solução

Você deseja que a página do cliente seja atualizada pelo comando (causado pelo MQ_RECEIVECELETET) do servidor, certo? Não é possível se for assim.

Minha sugestão é colocar uma função JS do cliente que será chamada pelo Timer (a cada segundo) e enviará uma solicitação assíncrona AJAX ao serviço da Web para novas mensagens no MessageQueue. Se essa mensagem existir, o JS tomará as ações necessárias (atualizando a página, etc.)

Outras dicas

Tente definir o Updatemode = "sempre" para o seu updatePanel ou ligue UpdatePanel1.Update(); no fim de MQ_RECEIVECELETED () método.

Verifique se você está atualizando a instância correta do objeto da página.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top