Discussione:
Comunicazione tra applicazione e Server WCF
(troppo vecchio per rispondere)
Mattia
2008-08-01 14:57:27 UTC
Permalink
Ciao a tutti,
sto progettando un applicazione WindowsForm che deve collegarsi
ad un Server WCF per ottenere i dati dal DB. Qual è il modo migliore
per gestire la comunicazione? Conviene gestire un messaggio XML
costruito ad hoc ad ogni richiesta o mi affido totalmente alla
serializzazione del framework utilizzando passando come parametri
direttamente oggetti dei tipi del framework (o definiti da me)?

Forse la domanda non è chiara, il problema è che non mi è del tutto
chiaro come avviene la comunicazione tra un'applicazione ed un
servizio WCF.

Ogni suggerimento anche non richiesto è apprezzato.

Grazie
Mattia
Raffaele Rialdi [MVP]
2008-08-01 15:56:00 UTC
Permalink
Post by Mattia
Ciao a tutti,
sto progettando un applicazione WindowsForm che deve collegarsi
ad un Server WCF per ottenere i dati dal DB. Qual è il modo migliore
per gestire la comunicazione? Conviene gestire un messaggio XML
costruito ad hoc ad ogni richiesta o mi affido totalmente alla
serializzazione del framework utilizzando passando come parametri
direttamente oggetti dei tipi del framework (o definiti da me)?
Forse la domanda non è chiara, il problema è che non mi è del tutto
chiaro come avviene la comunicazione tra un'applicazione ed un
servizio WCF.
Ogni suggerimento anche non richiesto è apprezzato.
Con WCF non hai bisogno di gestirti manualmente i messaggi xml.
Le classi che devono essere spostate oltre i confini di WCF devono
essere marcate come DataContract e le proprietà come DataMember.
In questo modo il WSDL conterrà queste informazioni e il client potrà
generare di conseguenza il proxy e le entity lato client.

Ti consiglio caldamente di leggerti un libro su WCF prima di
proseguire. Se non ti chiarisci questi aspetti, rischi di lavorare il
doppio inutilmente
Post by Mattia
Grazie
Mattia
Prego
--
Raffaele Rialdi
Microsoft .NET MVP http://mvp.support.microsoft.com -
http://italy.mvps.org UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org Weblog: http://blogs.ugidotnet.org/raffaele
Corrado Cavalli [MVP]
2008-08-02 04:48:09 UTC
Permalink
Oltre al consiglio di Raffaele valuta l'utilizzo di LINQ lato server, in
questo modo di basta modificare la serializzazione del DataContext a
"unidirectional" per avere tutte le entità accessibili lato client.
http://blogs.msdn.com/brada/archive/2008/06/26/data-focused-silverlight-demo.aspx
--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://blogs.ugidotnet.org/corrado/
Mattia
2008-08-04 07:03:34 UTC
Permalink
Grazie per i consigli!
Io, forse in base all'inesperienza, pensavo di costruire una stringa
(xml-like) e passare questa come argomento per il WCF-server. Questo
per avere maggior controllo sul COSA viene passato soprattutto in
termini di quantità di informazioni e per non avere un numero
esorbitante di metodi esposti dal server.
Una cosa tipo questa:

SERVER-WCF

String eseguiRichiesta(String richiesta);


CLIENT

String richiesta = ComponiXML("Ordini.GetAllOrders", fromDate,
toDate);
String Response = MyClient.eseguiRichiesta(richiesta);


Ci possono essere controindicazioni nell'usare questo metodo?

Grazie
Mattia
Andrea Boschin [MVP]
2008-08-04 07:21:17 UTC
Permalink
Post by Mattia
Grazie per i consigli!
Io, forse in base all'inesperienza, pensavo di costruire una stringa
(xml-like) e passare questa come argomento per il WCF-server. Questo
per avere maggior controllo sul COSA viene passato soprattutto in
termini di quantità di informazioni e per non avere un numero
esorbitante di metodi esposti dal server.
c'è qualche controindicazione nell'avere molti metodi esposti? Se il
tuo servizio fa molte cose dovrà giocoforza avere molti metodi...
Post by Mattia
SERVER-WCF
String eseguiRichiesta(String richiesta);
CLIENT
String richiesta = ComponiXML("Ordini.GetAllOrders", fromDate,
toDate);
String Response = MyClient.eseguiRichiesta(richiesta);
Ci possono essere controindicazioni nell'usare questo metodo?
Tutte le controindicazioni che puoi immaginare nel costruire una
sovrastruttura che replica il lavoro che già fa egregiamente WCF.

Inoltre il passare dell'XML come argomento non ti fa diminuire la
dimensione del messaggio perchè comunque gli header SOAP (se usi un
binding SOAP) ci saranno lo stesso.

Ciao!
Mattia
2008-08-04 07:46:15 UTC
Permalink
On 4 Ago, 09:21, Andrea Boschin [MVP]
Post by Andrea Boschin [MVP]
Post by Mattia
Grazie per i consigli!
Io, forse in base all'inesperienza, pensavo di costruire una stringa
(xml-like) e passare questa come argomento per il WCF-server. Questo
per avere maggior controllo sul COSA viene passato soprattutto in
termini di quantità di informazioni e per non avere un numero
esorbitante di metodi esposti dal server.
c'è qualche controindicazione nell'avere molti metodi esposti? Se il
tuo servizio fa molte cose dovrà giocoforza avere molti metodi...
Post by Mattia
SERVER-WCF
String eseguiRichiesta(String richiesta);
CLIENT
String richiesta = ComponiXML("Ordini.GetAllOrders", fromDate,
toDate);
String Response = MyClient.eseguiRichiesta(richiesta);
Ci possono essere controindicazioni nell'usare questo metodo?
Tutte le controindicazioni che puoi immaginare nel costruire una
sovrastruttura che replica il lavoro che già fa egregiamente WCF.
Certo avrà molti metodi, ma non saranno tutti esposti nel WSDL quindi
utilizzabili dal client.
Post by Andrea Boschin [MVP]
Inoltre il passare dell'XML come argomento non ti fa diminuire la
dimensione del messaggio perchè comunque gli header SOAP (se usi un
binding SOAP) ci saranno lo stesso.
Certo gli header ci sono comunque, ma il contenuto del messaggio è
solo quello che mi serve e non tutto l'oggetto serializzato.
Post by Andrea Boschin [MVP]
Ciao!- Nascondi testo citato
- Mostra testo citato -
E' comunque un'idea che non conviene seguire??
Grazie
Mattia
Andrea Boschin [MVP]
2008-08-05 00:11:59 UTC
Permalink
Post by Mattia
Certo avrà molti metodi, ma non saranno tutti esposti nel WSDL quindi
utilizzabili dal client.
Ripeto, non vedo controindicazioni ad avere molti metodi esposti dal
servizio.
Post by Mattia
Certo gli header ci sono comunque, ma il contenuto del messaggio è
solo quello che mi serve e non tutto l'oggetto serializzato.
nessuno ha detto che tu debba trasferire sulla rete gli oggetti di
business del tuo dominio. Anzi la cosa migliore probabilmente è quella
di creare delle classi "messaggio" che usi solo esclusivamente per
trasferire il minimo indispensabile...

Ciao!
Mattia
2008-08-05 16:13:40 UTC
Permalink
On 5 Ago, 02:11, Andrea Boschin [MVP]
Post by Andrea Boschin [MVP]
Post by Mattia
Certo avrà molti metodi, ma non saranno tutti esposti nel WSDL quindi
utilizzabili dal client.
Ripeto, non vedo controindicazioni ad avere molti metodi esposti dal
servizio.
Post by Mattia
Certo gli header ci sono comunque, ma il contenuto del messaggio è
solo quello che mi serve e non tutto l'oggetto serializzato.
nessuno ha detto che tu debba trasferire sulla rete gli oggetti di
business del tuo dominio. Anzi la cosa migliore probabilmente è quella
di creare delle classi "messaggio" che usi solo esclusivamente per
trasferire il minimo indispensabile...
Puoi spiegare meglio questo? Magari sai dove posso trovarne un
esempio?
Grazie mille
Mattia
Post by Andrea Boschin [MVP]
Ciao!
Andrea Boschin [MVP]
2008-08-05 16:31:37 UTC
Permalink
Post by Mattia
Post by Andrea Boschin [MVP]
nessuno ha detto che tu debba trasferire sulla rete gli oggetti di
business del tuo dominio. Anzi la cosa migliore probabilmente è quella
di creare delle classi "messaggio" che usi solo esclusivamente per
trasferire il minimo indispensabile...
Puoi spiegare meglio questo? Magari sai dove posso trovarne un
esempio?
Grazie mille
Mattia
come hai intuito non sempre è opportuno trasferire interi oggetti sulla
rete in risposta alla chiamata ad un metodo di un servizio (WCF o non
WCF). Per questo alcuni creano delle classi specifiche, Response e
Request che espongono solamente i dati strettamente necessari alla
chiamata che stai effettuando. Questo ha anche il vantaggio inverso e
cioe che puoi restituire un oggetto con più proprietà qualora il tuo
metodo lo richieda invece che chiamare due metodi distinti e quindi
minimizzi il numero di chiamate. es:

...
[OperationContract]
GetInitDataResponse GetInitData(GetInitDataRequest request)
...

[DataContract]
public class GetInitData
{
[DataMemeber]
public List<Product> Products { get; }
[DataMemeber]
public List<Order> Orders { get; }
[DataMemeber]
public Customer Customer { get; }
}

Ciao!
--
Andrea Boschin
Microsoft® MVP - [Visual Developer - ASP/ASP.NET]
http://blog.boschin.it
http://www.xedotnet.org
https://mvp.support.microsoft.com/profile/Andrea.Boschin
Mattia
2008-08-06 07:36:10 UTC
Permalink
Ciao!

Nell'esempio che hai fatto il DataContract è la Request o la Response?
Intuisco quindi che nel DataContract metto tutti i possibili oggetti
che posso passare nel caso non servono valorizzati a null, corretto?

E' conveniente utilizzare quest'approccio anche nel caso debba gestire
nel BusinessLayer la paginazione e l'ordinamento dei dati?

Grazie per il fondamentale Aiuto.
Mattia

On 5 Ago, 18:31, Andrea Boschin [MVP]
Post by Andrea Boschin [MVP]
Post by Mattia
Post by Andrea Boschin [MVP]
nessuno ha detto che tu debba trasferire sulla rete gli oggetti di
business del tuo dominio. Anzi la cosa migliore probabilmente è quella
di creare delle classi "messaggio" che usi solo esclusivamente per
trasferire il minimo indispensabile...
Puoi spiegare meglio questo? Magari sai dove posso trovarne un
esempio?
Grazie mille
Mattia
come hai intuito non sempre è opportuno trasferire interi oggetti sulla
rete in risposta alla chiamata ad un metodo di un servizio (WCF o non
WCF). Per questo alcuni creano delle classi specifiche, Response e
Request che espongono solamente i dati strettamente necessari alla
chiamata che stai effettuando. Questo ha anche il vantaggio inverso e
cioe che puoi restituire un oggetto con più proprietà qualora il tuo
metodo lo richieda invece che chiamare due metodi distinti e quindi
...
[OperationContract]
GetInitDataResponse GetInitData(GetInitDataRequest request)
...
[DataContract]
public class GetInitData
{
    [DataMemeber]
    public List<Product> Products { get; }
    [DataMemeber]
    public List<Order> Orders { get; }
    [DataMemeber]
    public Customer Customer { get; }
}
Ciao!
--
Andrea Boschin
Microsoft® MVP - [Visual Developer - ASP/ASP.NET]http://blog.boschin.ithttp://www.xedotnet.orghttps://mvp.support.microsoft.com/profile/Andrea.Boschin
Andrea Boschin [MVP]
2008-08-06 08:00:29 UTC
Permalink
Post by Mattia
Nell'esempio che hai fatto il DataContract è la Request o la Response?
nell'esempio il Datacontract è la Response.
Post by Mattia
Intuisco quindi che nel DataContract metto tutti i possibili oggetti
che posso passare nel caso non servono valorizzati a null, corretto?
No, intuizione errata. Il DataContract deve essere "forgiato" nel modo
più conveniente per ogni singolo metodo per

1) minimizzare i dati scambiati
2) minimizzare il numero di chiamate

Può sembrare che le due cose siano contrastanti l'una con l'altra ma si
tratta semplicemente di bilanciare le due cose.
Post by Mattia
E' conveniente utilizzare quest'approccio anche nel caso debba gestire
nel BusinessLayer la paginazione e l'ordinamento dei dati?
certo perchè no?

anzi potrebbe essere un buon esempio. nella request passi i criteri di
filtro, di ordinamento e di paginazione mentre nella response oltre ai
record estratti ti fai restituire anche il VirtualItemCount. così con
una sola chiamata fai tutto.
Post by Mattia
Grazie per il fondamentale Aiuto.
Mattia
Prego.
--
Andrea Boschin
Microsoft® MVP - [Visual Developer - ASP/ASP.NET]
http://blog.boschin.it
http://www.xedotnet.org
https://mvp.support.microsoft.com/profile/Andrea.Boschin
Loading...