63 messaggi dal 18 aprile 2008
ciao a tutti,
ho creato una applicazione desktop con vb.net ed inserito in un timer_tick la chiamata al web service
webClient.DownloadString("http://www.pxxxxxxxxy.it/ws_pxxxxxd.asmx/LEGGI_CONTATORE_ADP2013?")

in questo modo scarico ogni secondo il valore di un determinato campo di un db.
forse questo metodo è un po antiquato ma funziona.
l'unico problema avviene dopo un certo periodo, il web service va in tilt e restituisce l'errore 500.
troppe sessioni aperte.
ogni chiamata che faccio al service apre una sessione?quindi una sessione al secondo?
è possibile chiuderle o mantenere una sola sessione?
se utilizzo soap risolvo il problema? crea sessioni?
scusate la mia sete di info
Ciao,
forse nel codice che hai postato manca qualche riga ...
Come ottieni la tua variabile webClient?
Suppongo tu faccia un new HttpClient.
A questo punto dipende molto da coma hai implementato il codice.

Puoi controllare se la tua var webClient è diversa da null, ed a questo punto la istanzi.
Puoi fare la dispose della tua var webClient ogni volta che termini di usarla, ma nel tuo caso non mi sembra la soluzione migliore.

Prova a verificare questi piccoli accorgimenti, oppure posta del codice più completo

Ciao
Alberto
63 messaggi dal 18 aprile 2008
ciao alberto,
in questi giorni ho provato ad usare il prot. soap
dal client richiamo il ws in questo modo:

Dim proxy As New it.pxxxxxxy.www.ws_pxxxxxe

   Public Sub CARICA()

        LISTA_PIZZE.Items.Clear()

        Dim list As New List(Of String)
        list.AddRange(proxy.CARICA_PIZZE)

        Dim z As Integer = list.Count - 1
        For x = 0 To z
            LISTA_PIZZE.Items.Add(list.Item(x))
        Next x

    End Sub



mentre nel ws:

<System.Web.Services.WebMethod(EnableSession:=False)> _
    Public Function CARICA_PIZZE() As List(Of String)
        Dim conn As SqlCeConnection = New SqlCeConnection(connectCloud)
        conn.Open()

        Dim cmd As SqlCeCommand = conn.CreateCommand()
        cmd.CommandText = "SELECT * FROM [statistiche]"

        Dim reader As SqlCeDataReader = cmd.ExecuteReader()

        Dim list As New List(Of String)
        
        While (reader.Read())
            list.Add(reader("pizze").ToString())
        End While

        Return list

        cmd.Dispose()
        conn.Dispose()
        conn.Close()
    

    End Function



funziona tutto perfettamente ma quando richiedo frequentemente i dati
mi da l'errore "troppe sessioni aperte"
non sò più che provare...
Ciao,
per quello che posso vedere nel client, nuovamente, istanzi il tuo oggetto proxy, ma non lo rilasci mai.
Dipende molto da come hai implementato il progetto, ossia la parte di codice che rappresenta il tuo client e' una classe concreta che viene istanziata ogni volta?
Se e' cosi' ogni volta che esegui una new di quella classe esegui anche una new del tuo oggetto proxy.
Molto semplicemente,a mio avviso, devi verificare prima di istanziare l'oggetto proxy, ed eventualmente l'oggetto che lo contiene, se non hai un'istanza attiva dello stesso.

Spero di essere stato chiaro

Alberto
63 messaggi dal 18 aprile 2008
ciao ace68,
ho creato una classe così composta,
riporto solo una delle chiamate:
Imports System.Xml
Imports System.IO

Public Class clsWebService

    Dim ERRORE As New clsErrore
    Dim GRAFICO As New clsGrafico
    Dim proxy As New it.pxxxxxxy.www.ws_pizza2013e
......

    Public Property LISTA_PIZZE As ListBox
......

#Region "STATISTICHE"

    Public Sub CARICA_PIZZE()
        Try
            LISTA_PIZZE.Items.Clear()

            Dim list As New List(Of String)
            list.AddRange(proxy.CARICA_PIZZE)
            proxy.Dispose()
            Dim z As Integer = list.Count - 1
            For x = 0 To z
                LISTA_PIZZE.Items.Add(list.Item(x))
            Next x
        Catch
            RELOAD()
        End Try
    End Sub

#End Region

End Class


ho aggiunto proxy dispose ma il problema resta.
carica pizze viene richiamato da main:

dim ws as new clsWebService

....
ws.carica_pizze
....


Modificato da pobss il 11 settembre 2013 12.34 -
Provo ad immaginare il tuo progetto ...
Penso tu abbia un WCF service per farti restituire l'elenco delle pizze.
Quindi avrai inserito un riferimento a questo servizio nel tuo progetto di presentation per poterlo consumare.
Almeno, a grandi linee, io faccio in questo modo ;-)

A questo punto, dal progetto che deve consumare il servizio:
PizzaClient pizzaClient = new PizzaClient();

pizzaClient.GetElencoPizzeDelGiorno();

pizzaClient.Close();


In questo non lascio connessioni pendenti sul servizio.

Spero possa aiutarti

Alberto
1.508 messaggi dal 27 dicembre 2005
Ma un servizio WCF si può aggiungere nei riferimenti del progetto come i Webservice ?
Scusate, chiedo venia, ho risposto senza piu' ri-leggere il post ed ho confuso una risposta ad una persona con un'altra ...
In questo caso si parla di webservices, non serve assolutamente coinvolgere altri servizi.
Chiedo scusa ancora a tutti e due.

Tornando al problema.
Penso, come gia' accennato mi pare, che il problema stia ancora nell'implementazione del classe che utilizza proxy.
Nel tuo codice non c'e' nessun controllo che verifichi se proxy e' gia' istanziato o meno, ogni volta esegui new proxy().
Se riutilizzi lo stesso oggetto client non dovresti avere problemi di memory leak o connessioni aperte, etc, etc.
Non ti serve nemmeno fare il dispose, tanto la devi usare subito dopo.

Ciao
Alberto

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.