views:

95

answers:

3

I have a problem when handling the ReceiveCompleted event of a MessageQueue in ASP.NET. It catches it successfully, but every changes applied to the Controls of the page have no effect.

This is what I've got:

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

I don't why it fails updating those vars. It may be any nonesense, but I'm new to ASP.NET, so any clue will be welcome.

Thanks in advance!

Pablo

A: 

Try setting the UpdateMode="Always" to your UpdatePanel, or call UpdatePanel1.Update(); at the end of mq_ReceiveCompleted() method.

GregoryM
Thanks, but tried both with no success.
Pablo
A: 

Check that you are updating the correct instance of the page object.

How can I check that?I mean, just with this:Label1.Text = m.Body.ToString();the page should update itself, shouldn't it?Anyway, I've tried adding the UpdatePanel1.Update() as GregoryM suggests, and it doesn't work.
Pablo
A: 

You want the client page to be updated by the command (caused by mq_ReceiveCompleted) from the server, right? It isn't possible if it's so.

My suggestion is to put a client JS function that will be called by timer (each second or so) and will send an async AJAX request to the web service for new messages in MessageQueue. If such message exists the JS will take any actions needed (updating the page, etc.)

GregoryM
Yes, that was my intention... I thought it was possible to update the page from the serve but I see I was making a misconception.Thanks for the help!
Pablo