Ciao a tutti,
sto cercando una soluzione per implementare il long polling nelle mie applicazioni Asp.net, per fornire un servizio più vicino possibile al Push di Comet.
La soluzione che, per ora, ho trovato è la seguente:
webusercontrol con un updatePanel e un timer con interval=1000 millisec.
nell'UpdatePanel ho settato l'asyncPostback sul Tick del Timer
nell'updatepanel_load ho un loop su uno sleep da 2 secondi che esce al trascorrere di 5 secondi.
Un UpdateProgress mi consente di controllare quando il pannello ajax è in aggiornamento
(di seguito vi posto script e codice)
L'effetto che ho è la richiesta di aggiornamento dell'updatepanel rinnovata continuamente.
L'updatePanel ha timeout 90 secondi, quindi posso allungare il loop fino a 80 per non rischiare Timeout
Nell'istruzione di loop prevedo di inserire la lettura di una variabile Application che piloti l'esecuzione di una funzione di aggiornamento del contenuto (o meglio un raiseEvent, visto che stiamo parlando di un webusercontrol)
Il tutto funziona come dovrebbe, quindi la questione è relativa alle prestazioni: quanto può pesare il loop al server? (in termini globali, ovviamente)
Vi posto il codice (per la comunità
)
WebUserControl:AjaxLongPolling.aspx
codice:
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="AjaxLongPolling.ascx.vb" Inherits="Controls_AjaxLongPolling" %>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="LblStatus" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
</asp:UpdatePanel>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
Carico...
</ProgressTemplate>
</asp:UpdateProgress>
<asp:Timer ID="Timer1" runat="server" Interval="1000">
</asp:Timer>
Code Behind WebUserControl: AjaxLongPolling.aspx.vb
codice:
'Made By Bearseeker@forum.html.it
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Label1.Text = "Partito: " & Now.ToUniversalTime
End Sub
Protected Sub UpdatePanel1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles UpdatePanel1.Load
Dim entrata As DateTime = Now
Do While Not Now > DateAdd(DateInterval.Second, 5, entrata)
'qui dentro posso bloccare il loop tramite la lettura di una variabile application
System.Threading.Thread.Sleep(2000)
Loop
LblStatus.Text = "Aggiornato: " & Now.ToUniversalTime
End Sub