Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB.net 2.0] Ajax Long Polling (pseudo Push)

    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

  2. #2
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541
    Ma tu devi cambiar eil contenuto indipendentemente dal cambio di una variabile?
    Nel caso va bene così.
    Altrimenti se l'evento si deve scatenare solo quando cambia qualche cosa potresti usare un reverse ajax

  3. #3
    NI, ovvero non aggiorno.
    Con il viewstate attivo sull'updatePanel, allo scadere del tempo (o all'interruzione del loop) solo se ho un aggiornamento lo applico, altrimenti non faccio nulla, e il valore degli oggetti rimane invariato. (che non è l'esempio di codice che ho postato: lì aggiorna sempre la label)

    Comunque, hai qualche esempio di codice (o un algoritomo) reverse ajax per asp.net ?
    NB: Non voglio usare servizi esterni o server aggiuntivi, il tutto deve essere da codice.

    Ciao,
    b.

  4. #4
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541
    Originariamente inviato da Bearseeker
    NI, ovvero non aggiorno.
    Con il viewstate attivo sull'updatePanel, allo scadere del tempo (o all'interruzione del loop) solo se ho un aggiornamento lo applico, altrimenti non faccio nulla, e il valore degli oggetti rimane invariato. (che non è l'esempio di codice che ho postato: lì aggiorna sempre la label)

    Comunque, hai qualche esempio di codice (o un algoritomo) reverse ajax per asp.net ?
    NB: Non voglio usare servizi esterni o server aggiuntivi, il tutto deve essere da codice.

    Ciao,
    b.
    No esempi non ne tengo! Perchè solo ora mi è capitato di doverlo usare e sto ancora leggendo e cercando esempi pure io.

  5. #5
    Ecco.
    Quindi ti sarai accorto che, stando a documentazione, non è possibile il reverse ajax che non si basi sul protocollo Request<->Response tipico dell' HTTP e forzato da IIS.
    Ergo: o imposti il push, inteso come endless request, da IIS (che però non si può) oppure trovi un'altra strada

    Un esempio qui: (http://www.dotnetspider.com/resource...en-IFrame.aspx), che fa esattamente (solo con più codice) quello che ho scritto io.

    La questione è sempre quella iniziale, tuttora irrisolta:
    Se ho un loop su delle sleep da 1 secondo, e una media di 1000 utenti/giorno/pagina collegati, il server web ne può risentire?

    Any Comments?

    b.

  6. #6

  7. #7
    Utente di HTML.it L'avatar di mexican
    Registrato dal
    Oct 2001
    residenza
    cava de tirreni
    Messaggi
    3,541
    Originariamente inviato da mexican
    Prova a vedere qui:
    http://www.dynamick.it/reverse-ajax-1044.html
    Hai trovato qualche soluzione?

  8. #8
    In realtà no, ma ritengo che lo sleep di 1 secondo e un successivo controllo su una variabile Application (riferito all'esempio che ho postato nel primo articolo) sia l'unica soluzione accettabile.
    Ho provato ad implementare un Templated User Control per rendere riutilizzabile il sistema, ma ho ancora delle lacune sull'adattamento dei template nel design mode.
    Per ora ho congelato tutto come progetto "Owned" (Conoscenze non implementate) in attesa di una request che soddisfi l'esigenza di implementazione.

    Sto guardando anche la possibilità di costruire un servizio custom Tcp-ip per gestire il push tramite apposito client Javascript, ma sono ancora in alto mare.

    Ciao,
    b.

  9. #9
    ciao,
    stavo anche io da tempo studianto questa tecnologia e stavo anche costruendo un'applicazione di test.
    Inizialmente utilizzando asp.net classico con un webservice, poi mi piacerebbe utilizzare una libreria javascript.

    Visto che hai urgenza e io non ho pronta l'applicazione, ti do due riferimenti secondo me molto validi:

    il primo tratta appunto un'applicazione asp.net che sfrutta il fatto di creare un Dispatcher per inviare i messaggi ai vari client, ed una classe "singleton" per accodare i client in ascolto.
    ogni volta che il server ha pronto un messaggio per un determinato client, lo invia tramite il dispatcher, ed il client che è in "ascolto" (aspetta un evento con WaitOne) su un thread separato.
    ASP.NET C# Reverse Ajax example

    L'esempio sopra, è strutturato per un funzionamento semplice. Bosogna fare una piccola modifica altrimenti si blocca (il dispatcher) in caso di più richieste (getmessage) dallo stesso client, ma è facile.

    Potrebbe essere sufficiente, anche se necessita di qualche miglioria per integrarlo bene in una pagina web complessa.
    Puoi ad esempio fare riferimento anche a questo post.
    Long runnnig task with asp.net

    Fammi sapere se hai bisogno di supporto per questa implementazione di reverse ajax.


    Altra soluzione che vorrei valutare, ma non ho avora avuto tempo, è un framework javascript che ha un plugin apposito per il comet. Da una lettura veloce, mi sembra valido.
    http://pi.kodfabrik.com/documentation/plugin/pi.comet/

    Ciao
    Ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.