17 messaggi dal 14 agosto 2012
Buongiorno,
ho necessità di far eseguire web service asincroni (dal server, no dal client), indipendentemente da quale piattaforma vengono richiamati.
Esempio:
Un sito in php richiama il mio web service Pippo. Il web service recupera la chiamata e:

- Restituisce un messaggio di richiesta presa in carico
- Inserisce i dati su db

Le azioni dovranno essere in thread differenti, appunto asincroni.

È possibile?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
inserire i dati nel db non è un'operazione così onerosa da dover essere differita però non conosco il tuo scenario ed, effettivamente, potrebbe aver senso fare l'inserimento in maniera asincrona.

Se il tuo webservice è un servizio WCF, sarà molto, molto semplice realizzare quello che chiedi perché ti basterebbe configurare l'operazione come OneWay.
http://msdn.microsoft.com/en-us/magazine/cc163537.aspx#S1

Non devi neanche crearti esplicitamente altri thread perché sarà il servizio stesso a gestire la situazione. Il client riceverà una risposta immediata, mentre nel frattempo avverrà l'inserimento nel database.

Questo è un approccio fire-and-forget, per cui il client non riuscirà a sapere se l'operazione ha avuto buon esito o no, ma penso che tu l'abbia già considerato.

ciao,
Moreno
Modificato da BrightSoul il 03 ottobre 2014 08.47 -

Enjoy learning and just keep making
17 messaggi dal 14 agosto 2012
Ciao,
purtroppo non è un WCF ma un Web Service classico. Non conosco bene i WCF ma possono essere integrati in qualsiasi scenario? Ovvero, chi consuma i WCF può essere un client, un sito in php, in jsp, ecc..?

Se fosse così posso prevedere di creare un WCF per il mio scopo.

Ovviamente, come mi hai fatto notare, avevo già pensato di inviare una risposta definitiva dopo che il metodo asincrono aveva finito di "fare il suo lavoro". La risposta la invierò tramite un Web Service messo a disposizione dal chi consuma il mio.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

Maverick1983 ha scritto:

Ovvero, chi consuma i WCF può essere un client, un sito in php, in jsp, ecc..?

Certamente. Consumare un servizio WCF per un client PHP è più semplice che consumare un Web Service "classico". Questo è possibile perché lo stesso servizio WCF può essere esposto su vari endpoints, ciascuno con una propria configurazione e set di funzionalità.
  • Ai client che trovano difficoltoso o complicato inviare richieste SOAP, offrirai un endpoint che sfrutta il webHttpBinding. Il client potrà così inviare banali richieste REST anziché dover rispettare lo standard SOAP. E' un tipo di binding molto interoperabile, che sarà idoneo a qualsiasi tipo di client.
  • Ai client che preferiscono usare SOAP, offrirai un basicHttpBinding che portà con sé il set di funzionalità descritto dallo standard WS-I Basic. Sono incluse ad esempio: sicurezza a livello di messaggio, encoding binario, streaming (utile per l'invio di una certa mole di dati)
  • Ai client che supportano l'intero stack WS-*, offrirai un wsDualHttpBinding, che permette di usare sessioni, transazioni e connessioni duplex. Un servizio Duplex, in particolare, sarebbe la risposta ideale e standard a questa tua necessità:

    La risposta la invierò tramite un Web Service messo a disposizione dal chi consuma il mio.


I bindings che ti ho menzionato regolano la serializzazione e le funzionalità offerte dal servizio. Non sei costretto a scendere ai minimi termini perché puoi esporre più endpoints con bindings diversi. Riuscirai a supportare sia quei client che richiedono il massimo dell'interoperabilità a scapito di funzionalità offerte, fino ad arrivare ai client che supportano tutto lo stack di specifiche WS-* e che perciò possono sfruttarle appieno.

Ecco un elenco più completo dei bindings a tua disposizione:
http://msdn.microsoft.com/en-us/library/ms730879(v=vs.110).aspx

Come avrai intuito, WCF ha una curva d'apprendimento un po' più ripida rispetto ai classici Webservice ASMX. Decidi tu se investire il tuo tempo nell'apprendimento di WCF o se rimanere su ASMX e destinare quel tempo allo sviluppo di funzionalità che su WCF esistono già.

ciao,
Moreno
Modificato da BrightSoul il 03 ottobre 2014 19.55 -

Enjoy learning and just keep making
17 messaggi dal 14 agosto 2012
Intanto, grazie per le risposte esaustive!

Vediamo se mi puoi dare un tuo parere per il WS.

Attualmente ho già rilasciato dei WS al Cliente, WS classico ASMX. Non dovevano fare molto "lavoro".

Purtroppo utilizzando un metodo via web (PHP) si è riscontrato un problema di timeout in attesa della risposta del WS.

Per ovviare al problema, appunto, avevo pensato di effettuare un WS asincrono. Non volendo cambiare tutti i metodi e riscriverli con WCF, potrei richiamare all'interno dell'attuale WS, un WCF, che non sarà visibile dall'esterno. (questo altro punto da smarcare, magari controllo l'host da cui è chiamato?!)

Scenario:
sito php --> WS attuale
WS attuale --> subito risposta "Presa in carico"
WS attuale --> WCF nuovo
WCF nuovo --> risposta al sito php

Grazie.
Modificato da Maverick1983 il 04 ottobre 2014 12.20 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego!

Maverick1983 ha scritto:

Attualmente ho già rilasciato dei WS al Cliente,

Ok, allora fermiamoci un attimo. Se l'hai già fatto, dover rifare tutto in WCF potrebbe farti perdere del tempo inutilmente.

Maverick1983 ha scritto:

WS attuale --> WCF nuovo

Tecnicamente potrebbe funzionare, ma non mi piace molto come soluzione. Aggiungeresti una complessità che vorrei tu evitassi.

Cerchiamo di capire bene il motivo per cui la richiesta di questo client PHP va in timeout. Se prendiamo questo problema di petto e riusciamo a risolverlo, non sussisterà più il bisogno di inserire i dati in maniera asincrona.

Ti faccio delle domande per capire meglio il problema:
  • Oltre al client PHP, esistono altri client che invece riescono ad usare quel metodo del webservice senza incappare in un timeout?
  • Il client PHP invia una mole di dati tale da giustificare il timeout?
  • Che cosa fa il server per impiegare così tanto tempo nel fornire una risposta? Si limita ad inserire dei dati nel database o deve fare dei calcoli complessi?


ciao,
Moreno

Enjoy learning and just keep making
17 messaggi dal 14 agosto 2012
BrightSoul ha scritto:

Ti faccio delle domande per capire meglio il problema:
  • Oltre al client PHP, esistono altri client che invece riescono ad usare quel metodo del webservice senza incappare in un timeout?


  • No. Anche tramite client Windows Form arriva il timeout.


  • Il client PHP invia una mole di dati tale da giustificare il timeout?


  • No


  • Che cosa fa il server per impiegare così tanto tempo nel fornire una risposta? Si limita ad inserire dei dati nel database o deve fare dei calcoli complessi?


  • Il server esegue molti calcoli complessi. Tabelle temporanee, controlla determinate condizioni, store procedure, ecc.
    Non si possono modificare o cambiare le operazioni lato server in quanto sono parte di operazioni che vengono effettuate all'interno da software Windows Form per la medesima operazione.


Ciao Luca.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao Luca,
ok, ora ho bene capito la situazione ma non sono sicuro di quale sia la soluzione migliore nel tuo caso. Ormai hai sviluppato il servizio ASMX e non posso semplicemente consigliarti di ricominciare da capo per rifarlo con WCF, cioè una tecnologia che andresti ad usare per la prima volta.

Posso dirti che con un servizio WCF Duplex non avresti problemi con il client WinForms, ammesso che non subentrino intoppi legati alla rete, tipo firewall da configurare. Il client PHP, non metto in dubbio che sia possibile far funzionare anche quello (col wsDualHttpBinding si tratta pur sempre di messaggi SOAP scambiati via HTTP), ma non l'ho mai fatto e non riesco a prevedere quali sarebbero le difficoltà o lo sforzo necessario.

Quindi, come soluzione rapida, per ora potresti lasciare tutto com'è e alzare semplicemente la soglia di timeout, agendo sull'attributo executionTimeout dell'elemento httpRuntime, dal web.config.
http://msdn.microsoft.com/it-it/library/e1f13641(v=vs.85).aspx

Poi, solo se hai tempo da dedicare alla ricerca, fai qualche esperimento con PHP e un servizio WCF Duplex sul tuo PC di sviluppo. Servirà un web debugger tipo Fiddler e una buona dose di perizia. Prima di iniziare, chiedi un parere anche all'amministratore di rete che ti saprà dire se ci sono ostacoli fisici che impediscono al server di ricontattare il client.

Se invece preferisci restare su ASMX, puoi sviluppare una tua soluzione personalizzata. Il servizio si occuperà semplicemente di raccogliere la richiesta del client e salvarla in un database o in una coda. Poi, da un altro thread o processo, provvederai a scodare un'operazione dalla coda, svolgere il lavoro e, al termine, notificare il client.

ciao,
Moreno
Modificato da BrightSoul il 06 ottobre 2014 23.42 -

Enjoy learning and just keep making

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.