Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Richiesta multipla metodo webservice

5 views
Skip to first unread message

Riddler ?

unread,
May 30, 2009, 1:20:14 PM5/30/09
to
Buona sera,
sposto quì una discussione iniziata altrove ... (C#)
<http://groups.google.it/group/microsoft.public.it.dotnet.csharp/
browse_frm/thread/4eee4ef137998687#>

Il problema è il seguente:
ho un client che interagisce con un WS classico asmx
in modo asincrono con la tecnica adottata anche da Silverlight

WS.NomeMetodoCompleted += new
nomeApplicazione.Proxy.NomeMetodoCompletedEventHandler
(WS_NomeMetodoCompleted);

WS.NomeMetodoAsync(paramentro);

void WS_NomeMetodoCompleted(object sender,
nomeApplicazione.Proxy.NomeMetodoCompletedEventArgs e)
{
UTILIZZO DI e.Result;
}

Anche aprendo un altro tab nel browser ... essendo la STESSA
sessione ...
NON posso operare finchè l'elaborazione lanciata nel tab precedente
NON è stata ultimata ...

attualmente le pagine hanno un meta
Async="true"

Ed in una pagina un iFrame che ogni "tot" richiede al WS alcuni dati
da visualizzare, ma è tutto "freezato" finchè il metodo non
termina ...

Ho avuto una dritta (grazie ancora a Roberto Collina) riguardatnte la
possibilità di utilizzare più chiamate all'interno della stessa
sessione.
<http://books.google.it/books?
id=1rMHA3BlKeoC&pg=PA293&lpg=PA293&dq=as... >

Posso operare in questo senso?

Grazie anticipatamente a tutti

saluti

--
Riddler ?

Riddler ?

unread,
May 31, 2009, 12:19:41 PM5/31/09
to
On 30 Mag, 19:20, "Riddler ?" <MG.ridd...@gmail.com> wrote:
Aggiunta ...

Ho fatto come dall'articolo letto...

Lato WebServices ho aggiunto al metodo
[WebMethod(EnableSession = true, CacheDuration=30)]

Lato Client valorizzo il Cookie
WS.CookieContainer = new CookieContainer();

Ma se eseguo una elaborazione e tento di aprire un altro tab per
eseguirne un altra, il tab non carica la pagina finche l'elaborazione
lanciata non termina ...

Cosa manca?
C'è qualcuno che si è trovato in situazioni simili?

Mauro Servienti [MVP]

unread,
Jun 1, 2009, 3:31:56 AM6/1/09
to
Ciao Riddler ?,

You wrote on 30/05/2009 :
> Il problema ᅵ il seguente:


> ho un client che interagisce con un WS classico asmx
> in modo asincrono con la tecnica adottata anche da Silverlight

> Anche aprendo un altro tab nel browser ... essendo la STESSA
> sessione ...

> NON posso operare finchᅵ l'elaborazione lananciata nel tab precedente
> NON ᅵ stata ultimata ...

Forse mi manca un pezzo, ma a me funziona... facendo una cosa di questo
genere:

using( var svc = new localhost.MyService() )
{
svc.HelloWorldCompleted += ( s, e ) =>
{
Console.WriteLine( e.Result );
};

svc.HelloWorldAsync( 5000, Guid.NewGuid() );
svc.HelloWorldAsync( 0, Guid.NewGuid() );
}

dove HelloWorld ᅵ definita cosᅵ:

[WebMethod]
public string HelloWorld( Int32 sleep )
{
Thread.Sleep( sleep );

return String.Format( "Hello World, I've slept for {0}ms", sleep );
}

viene scodata prima la seconda richiesta e poi la prima senza nessun
blocco.

Ma lo "state" lo passi?, altrimenti non potrᅵ mai funzionare perchᅵ il
ws non saprebbe chi chiamare con che cosa per la risposta, ᅵ anche
strano che tu non abbia una exception.

.m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it


Riddler ?

unread,
Jun 1, 2009, 4:25:52 AM6/1/09
to
On 1 Giu, 09:31, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
Ciao Mauro!
anche tu niente ponte?
;-)

grazie mille per avermi risposto ;-)

> Forse mi manca un pezzo, ma a me funziona...

uh! che cavolo ho combinato allora?

> facendo una cosa di questo
> genere:
>
> using( var svc = new localhost.MyService() )
> {
>         svc.HelloWorldCompleted += ( s, e ) =>
>         {
>                 Console.WriteLine( e.Result );
>         };
>
>         svc.HelloWorldAsync( 5000, Guid.NewGuid() );
>         svc.HelloWorldAsync( 0, Guid.NewGuid() );
>
> }
>

> dove HelloWorld è definita così:


>
> [WebMethod]
> public string HelloWorld( Int32 sleep )
> {
>         Thread.Sleep( sleep );
>
>         return String.Format( "Hello World, I've slept for {0}ms", sleep );
>
> }
>
> viene scodata prima la seconda richiesta e poi la prima senza nessun
> blocco.
>
> Ma lo "state" lo passi?,

ahi!
sai che ... mi sa che hai fatto centro!
state ... state ... mmm ... temo di no ... lo devo inserire negli
header?

questa è la configurazione nel webconfig lato WS

<!-- SESSIONE -->
<sessionState mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data
source=127.0.0.1;Trusted_Connection=yes;Integrated Security=SSPI"
cookieless="false"
timeout="30">
</sessionState>

Anche se nel mio caso NON servono ho inserito stateConnectionString e
sqlConnectionString
> altrimenti non potrà mai funzionare perchè il
> ws non saprebbe chi chiamare con che cosa per la risposta, è anche


> strano che tu non abbia una exception.

Ma i risultati li ottengo corretamente nelle chiamate in cui attendo
una risposta ...

Il mio WebService è asmx ... copio/incollo la chiamata tagliando il
tagliabile ed inutile al problema ...

protected void BtnPreprocess_Click(object sender, EventArgs e)
{
int ris = -1;
int[] selected_row;
myWS WS = new myWS.Service(); // WebService

WS.CookieContainer = new CookieContainer();

WS.Preprocess_DBCompleted += new
Client_WebApplication.myWS.Preprocess_DBCompletedEventHandler
(WS_Preprocess_DBCompleted);

WS.Preprocess_DBAsync(flgs.ToArray());
}

void WS_Preprocess_DBCompleted(object sender,
Client_WebApplication.myWS.Preprocess_DBCompletedEventArgs e)
{
int ris = e.Result;
// valutazioni di ris ...
MsgOperation.Visible = true;
}

dove lo metto lo state?

Scusa la banalità della domanda Mauro, ma ormai è un periodo MOLTO
lungo ... sono letteralmente fuso ... avrei bisogno di staccare ... ma
DEVO finire :-(

--
Riddler ?

Riddler ?

unread,
Jun 1, 2009, 4:37:47 AM6/1/09
to
On 1 Giu, 09:31, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
> è anche strano che tu non abbia una exception.

dimenticavo ... non nessuna exception ...
chiama il metodo (che impiega MOLTO tempo) e tutto è fermo finchè non
finisce ...
L'interfaccia web non è bloccata, ma se clicco su un link ad un altra
pagina NON va a quella pagina fino a fine elaborazione ...

Ho visto in rete che in alcuni esempi viene generata una variabile
lato client da passare al WS dici che è il casi di aggiungere una cosa
del genere invece di crearla nuova come sto facendo?

if (Session["CookieVar"] == null)
cookieVar= new CookieContainer();
else
cookieVar = (CookieContainer) Session["CookieVar"];


graSSSie ancora
;-)

--
Riddler ?

Riddler ?

unread,
Jun 1, 2009, 6:18:16 AM6/1/09
to
On 1 Giu, 09:31, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
> Forse mi manca un pezzo, ma a me funziona... facendo una cosa di questo
> genere:
>
> using( var svc = new localhost.MyService() )
> {
>         svc.HelloWorldCompleted += ( s, e ) =>
>         {
>                 Console.WriteLine( e.Result );
>         };
>
>         svc.HelloWorldAsync( 5000, Guid.NewGuid() );
>         svc.HelloWorldAsync( 0, Guid.NewGuid() );
>
> }

Una aggiuntina ...

Nel mio caso ho un tab del browser alla pagina di elaborazione che
cliccando sul bottone richiede al WS di elaborare utilizzando il
metodo "elabora" ... se tento di aprire un altra tab ed invocare lo
stesso metodo magari su altri dati ... NON posso operare alcun
caricamento finchè la prima elaborazione NON ha finito :-(

NON so se riesco a rendere l'idea ... sembra quasi che le richieste
vengano "accodate" ed eseguite sequenzialmente, quindi dopo aver fatto
la prima NON posso farne altre finche questa non è ultimata ...

Visto che l'elaborazione è MOLTO onerosa e lunga questo rende
"fastidioso" aprire una ulteriore istanza del browser per visualizzare
i dati o fare altro mentre il metodo continua ...

io NON ho proprio più idea di cosa tentare :-((

Come posso passare lo state al WS? e come questo mi risolverebbe la
cosa ?
... sarà che sono fuso ... sarà che sono niubbo ... ma NON riesco a
capire ...
:-(

--
Riddler ?

Mauro Servienti [MVP]

unread,
Jun 3, 2009, 3:13:06 AM6/3/09
to
Ciao Riddler ?,

You wrote on 01/06/2009 :
> Una aggiuntina ...

provi a descrivere l'architettura, non la struttura del tuo progetto ma
come funziona.

Riddler ?

unread,
Jun 3, 2009, 11:43:46 PM6/3/09
to
On 3 Giu, 09:13, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
Ciao Mauro,
grazie dell'attenzione.

> provi a descrivere l'architettura, non la struttura del tuo progetto ma
> come funziona.


CERTO! :-)
Scusa ma ieri sono partito presto e rientrato tardi ...

Ho un WS che espone dei metodi ed un client web che attraverso il
browser interroga il WS e visualizza gli eventuali risultati.

Nella pagina specifica le operazioni sono le seguenti
- compilo determinati campi come matricola ed intervallo di date
- carico dal database in un gridview l'elenco delle informazioni
richieste
- abilito il check delle tuple che mi interessano
- lancio l'elaborazione delle tuple selezionate

Il metodo del WS a questo punto esegue per ogni tupla l'elaborazione
(MOLTO lunga, facciamo un paio di minuti), SE mentre ho lanciato
l'elaborazione volessi andare in un altra pagina del client non posso
nella stessa sessione finchè l'elaborazione non termina.

Al momento posso ovviare aprendo un altra instanza del browser e
rilanciare una nuova elaborazione da lì.

Una naturale evoluzione dell'attuale WS sarà dalla versione asmx a
WCF, ma questo avverà un pò più avanti ... quando sarà supportato
anche da Mono.

--
Riddler ?

Mauro Servienti [MVP]

unread,
Jun 4, 2009, 12:41:34 AM6/4/09
to
Ciao Riddler ?,

You wrote on 04/06/2009 :
> Il metodo del WS a questo punto esegue per ogni tupla l'elaborazione
> (MOLTO lunga, facciamo un paio di minuti), SE mentre ho lanciato
> l'elaborazione volessi andare in un altra pagina del client non posso

> nella stessa sessione finchᅵ l'elaborazione non termina.

quindi il tuo scopo ᅵ far diventare la chiamata al ws asincrona in modo
da liberarti il prima possibile giusto?

Riddler ?

unread,
Jun 4, 2009, 1:11:06 AM6/4/09
to
On 4 Giu, 06:41, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:

Ekkime!

>
> > Il metodo del WS a questo punto esegue per ogni tupla l'elaborazione
> > (MOLTO lunga, facciamo un paio di minuti), SE mentre ho lanciato
> > l'elaborazione volessi andare in un altra pagina del client non posso

> > nella stessa sessione finchè l'elaborazione non termina.
>
> quindi il tuo scopo è far diventare la chiamata al ws asincrona in modo


> da liberarti il prima possibile giusto?

La chiamata è già asincrona, diciamo che ho "tentato" di lanciare
dalla stessa interfaccia via browser più di una elaborazione ovvero
diversi blocchi di record in successive richieste.
Ex.
ricerca matricola xxx1 selezioni 5 record ---> ELABORAZIONE
ricerca matricola xxx2 selezioni 7 record ---> ELABORAZIONE
...

ricerca matricola xxxn selezioni 2 record ---> ELABORAZIONE

Ma dato il tempo ECCESSIVO di elaborazione ... la reale richiesta
potrebbe essere al più su due matricole ... ed in questo momento è
possibile farlo aprendo due istanze differenti del browser, con uno
chiedo la xxx1 e con l'altro la xxx2.

Era un tentativo ... se si riesce con i settaggi del cookie di
sessione e poco altro ben venga altrimenti se devo mettermi ad
implementare e gestire code e loro sincronizzazione preferisco
aspettare il passaggio a WCF ed investire in altro più produttivo...

Cosa ne dici?

grazie ancora del tempo...

--
Riddler ?

Mauro Servienti [MVP]

unread,
Jun 4, 2009, 1:24:30 AM6/4/09
to
Ciao Riddler ?,

You wrote on 04/06/2009 :
> Ma dato il tempo ECCESSIVO di elaborazione ... la reale richiesta

> potrebbe essere al piᅵ su due matricole ... ed in questo momento ᅵ


> possibile farlo aprendo due istanze differenti del browser, con uno
> chiedo la xxx1 e con l'altro la xxx2.
>
> Era un tentativo ... se si riesce con i settaggi del cookie di
> sessione e poco altro ben venga altrimenti se devo mettermi ad
> implementare e gestire code e loro sincronizzazione preferisco

> aspettare il passaggio a WCF ed investire in altro piᅵ produttivo...
>
> Cosa ne dici?

che WCF non ti risolve il problema, non ho fatto prove ma cosᅵ a naso
direi che il problema sta sulla parte client, quindi l'applicazione
web, e non sulla parte server. L'inghippo in questo caso ᅵ che sei in
una situazione un po' atipica:

--> chiamata http;
--> pagina aspx
--> handler per la callback dal WS
--> chiamata WS asincrona
--> completamento del ciclo di vita della pagina

e la callback che fine fa?

Dovrei fare un po' di prove per capire bene lo scenario, e purtroppo
non ho tempo neanche a pagarlo a peso d'oro...

Riddler ?

unread,
Jun 4, 2009, 1:36:18 AM6/4/09
to
On 4 Giu, 07:24, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:

> Ciao Riddler ?,
>
> You wrote on 04/06/2009 :
>
> > Ma dato il tempo ECCESSIVO di elaborazione ... la reale richiesta
> > potrebbe essere al più su due matricole ... ed in questo momento è

> > possibile farlo aprendo due istanze differenti del browser, con uno
> > chiedo la xxx1 e con l'altro la xxx2.
>
> > Era un tentativo ... se si riesce con i settaggi del cookie di
> > sessione e poco altro ben venga altrimenti se devo mettermi ad
> > implementare e gestire code e loro sincronizzazione preferisco
> > aspettare il passaggio a WCF ed investire in altro più produttivo...
>
> > Cosa ne dici?
>
> che WCF non ti risolve il problema, non ho fatto prove ma così a naso

> direi che il problema sta sulla parte client, quindi l'applicazione
> web, e non sulla parte server. L'inghippo in questo caso è che sei in

> una situazione un po' atipica:
>
> --> chiamata http;
> --> pagina aspx
>    --> handler per la callback dal WS
>    --> chiamata WS asincrona
> --> completamento del ciclo di vita della pagina
>
> e la callback che fine fa?

infatti è proprio quì che poi NON si capisce più niente ...

> Dovrei fare un po' di prove per capire bene lo scenario, e purtroppo
> non ho tempo neanche a pagarlo a peso d'oro...

ma figurati!
va benissimo così! ;-)

SE c'era una possibile soluzione fattibile ed "ordinata" bene,
altrimenti inutile fare accrocchi su accrocchi ;-)
SE e ridico SE diventa necessario inviare parallelamente una doppia
richiesta si apriranno due istanze ;-)

NON mi torna però il perchè se il WS elabora ed invia la risposta ...
il client debba stare nella pagina che ha lanciato la richiesta finchè
non arrica il call back ...

Se volessi lanciare l'elaborazio e NON aspettare l'eventuale risposta
è possibile scavallare la callback ed esaudire l'eventuale link
premuto per andare in un altra pagina?

grazie ancora

saluti

--
Riddler ?

Mauro Servienti [MVP]

unread,
Jun 4, 2009, 3:32:01 AM6/4/09
to
Ciao Riddler ?,

You wrote on 04/06/2009 :
> Se volessi lanciare l'elaborazio e NON aspettare l'eventuale risposta

> ᅵ possibile scavallare la callback ed esaudire l'eventuale link


> premuto per andare in un altra pagina?

non agganciare l'evento della callback, fai un semplice fire & forget
chiamando la WebMethodAsync() e basta.

Riddler ?

unread,
Jun 4, 2009, 4:19:55 AM6/4/09
to
On 4 Giu, 09:32, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
Ciao Mauro
grazie come sempre.

>
> > Se volessi lanciare l'elaborazio e NON aspettare l'eventuale risposta

> > è possibile scavallare la callback ed esaudire l'eventuale link


> > premuto per andare in un altra pagina?
>
> non agganciare l'evento della callback, fai un semplice fire & forget
> chiamando la WebMethodAsync() e basta.
>

mmm però non posso rimanere in attesa dell'eventuale risultato e SE
l'utente decide di cambiare pagina fare il fire & forget giusto?

o aspetto

o brucio e dimentico ;-)

correcto?

--
Riddler ?

Mauro Servienti [MVP]

unread,
Jun 4, 2009, 4:36:21 AM6/4/09
to
Ciao Riddler ?,

You wrote on 04/06/2009 :
> o aspetto
> o brucio e dimentico ;-)

Non hai molte alternative, io perᅵ farei:

- gestire le work queue al servizio
- il client si limita a chiamare un metodo con cui chiede di accodare
un nuovo lavoro, niente XxxAsync
- e se na va
- il servizio ha un sistema interno di gestione delle code e scoda
come e quando gli pare
- farei esporre al servizio un sistema per interrogare lo stato di un
WorkItem nella coda: In attesa, In esecuzione, Completato, in errore,
bla bla
- quando il client chiama il servizio per accodare un nuovo WorkItem
gli passa tutti i dettagli del caso e riceve in cambio un TrackingId
che ᅵ un token univoco per quel workitem con il quale il client puᅵ
tornare dal servizio per sapere lo stato di quello specifico WorkItem;

a questo punto puoi gestire n WorkItem per client, ti basta piazzarrti
da qualche parte i TrackingId e potresti avere un sistema simil
carrello di un negozio di eCommerce in cui in ogni pagina visualizzi un
piccolo box con l'elenco degli WorkItem in coda per quello specifico
utente e il relativo stato.. se poi vuoi dannarti ti armi di Ajax e fai
in modo che il tutto si asincrono anche addirittura rispetto alla
chiamata http ma questo ᅵ un dettaglio.

Tutto ciᅵ a prescindere dalla tecnologia utilizzata per la
comunicazione e per la realizzazione del servizio, non ᅵ che wcf ti
regali qualcosa in piᅵ in questo senso.

Riddler ?

unread,
Jun 4, 2009, 5:36:14 AM6/4/09
to
On 4 Giu, 10:36, Mauro Servienti [MVP] <mauroservie...@online.nospam>
wrote:
Ciao Mauro,

> > o aspetto
> > o brucio e dimentico ;-)
>

> Non hai molte alternative, io però farei:


>
> - gestire le work queue al servizio
>   - il client si limita a chiamare un metodo con cui chiede di accodare
> un nuovo lavoro, niente XxxAsync
>   - e se na va
>   - il servizio ha un sistema interno di gestione delle code e scoda
> come e quando gli pare
> - farei esporre al servizio un sistema per interrogare lo stato di un
> WorkItem nella coda: In attesa, In esecuzione, Completato, in errore,
> bla bla
> - quando il client chiama il servizio per accodare un nuovo WorkItem
> gli passa tutti i dettagli del caso e riceve in cambio un TrackingId

> che è un token univoco per quel workitem con il quale il client può


> tornare dal servizio per sapere lo stato di quello specifico WorkItem;
>
> a questo punto puoi gestire n WorkItem per client, ti basta piazzarrti
> da qualche parte i TrackingId e potresti avere un sistema simil
> carrello di un negozio di eCommerce in cui in ogni pagina visualizzi un
> piccolo box con l'elenco degli WorkItem in coda per quello specifico
> utente e il relativo stato.. se poi vuoi dannarti ti armi di Ajax e fai
> in modo che il tutto si asincrono anche addirittura rispetto alla

> chiamata http ma questo è un dettaglio.
>

OTTIMA dritta ;-)
in questo modo rimane TUTTO lato WS, se serve si chiede e si
visualizza la risposta ;-)

Nella prossima evoluzione sarà una dritta preziosissima!
graSSSie mille!

> Tutto ciò a prescindere dalla tecnologia utilizzata per la
> comunicazione e per la realizzazione del servizio, non è che wcf ti
> regali qualcosa in più in questo senso.

Avevo letto che c'era le gestione delle code direttamente ...

--
Riddler ?

0 new messages