Question

J'ai un problème lors de la manipulation de l'événement ReceiveCompleted d'un MessageQueue dans ASP.NET. Il attrape avec succès, mais tous les changements appliqués aux contrôles de la page n'a pas d'effet.

Voici ce que j'ai:

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

Je ne sais pas pourquoi il échoue la mise à jour de ces vars. Il peut être tout nonesense, mais je suis nouveau à ASP.NET, de sorte que toute idée sera la bienvenue.

Merci d'avance!

Pablo

Était-ce utile?

La solution

Vous souhaitez que la page du client à être mis à jour par la commande (provoquée par mq_ReceiveCompleted) à partir du serveur, non? Il est impossible si elle est ainsi.

Ma suggestion est de mettre une fonction JS client qui sera appelé par minuterie (chaque seconde environ) et envoyer une demande d'AJAX async au service Web pour les nouveaux messages dans MessageQueue. Si tel message existe la JS prendra toutes les mesures nécessaires (mise à jour la page, etc.)

Autres conseils

Définissez la UpdateMode = "always" à votre UpdatePanel, ou appelez UpdatePanel1.Update(); à la fin de mq_ReceiveCompleted () méthode.

Vérifiez que vous mettez à jour l'instance correcte de l'objet page.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top