2011-11-25 12 views
6

Sono (ancora e ancora) cercando di consumare alcuni servizi WCF in Monotouch. Primo approccio: aggiungere un riferimento Web in Monodevelop non riuscito. Non può creare il file di riferimento. Poi ho provato SVCUTIL.EXE e ho ricevuto un errore sul fatto che il generico ChannelFactory non è disponibile in Monotouch - suppongo perché non ci sono riflessi disponibili.Monotouch e WCF: differenza tra SVCUTIL.EXE e SLSVCUTIL.EXE e come evitare ChannelFactory generico non supportato?

Successivamente ho provato SLSVCUTIL.EXE dall'SDK Silverlight 3. Ciò genera spazi dei nomi per i vari servizi che differiscono da quelli creati tramite SVCUTIL.EXE. Dato che ho già un sacco di codice wrapper, devo cambiare molto.

Queste domande sorgono:

  • Posso ignorare i metodi CreateChannel e tornare canali specializzati per ogni servizio, invece di essere dipendente dalla versione non-esistente generica, come proposto dal l'eccezione che si butta? Ciò significa correggere il codice generato da SVCUTIL.EXE.
  • Come si crea un canale in un metodo sottoposto a override? Ho solo le interfacce dei miei servizi. Ho cercato su Google e non ho trovato alcun esempio. Che aspetto ha il codice che deve essere scritto in quel metodo?
  • Totalmente poco chiaro per me: qual è la differenza tra le due utilità di servizio?
  • Se viene risolto il problema dello spazio dei nomi, gli stub creati tramite l'utilità Silverlight renderanno il mio progetto funzionante o risentiranno anche del problema del canale generico?
  • perché lo strumento Silverlight può funzionare senza emettere codice in modo dinamico? Qual è la differenza nel codice emesso e quale vantaggio ha la versione dinamica?
  • quale versione di Silverlight è supportata int MT. Posso usare lo strumento di v4 o deve essere la versione 3?
  • WCF in MT supporta lo streaming, come il download di file di grandi dimensioni?

risposta

5

WCF è un enorme bestia ed è molto difficile dare risposte generali su di esso, troppo dipende da dettagli. La regola generale è che MonoTouch supporta lo stesso sottoinsieme di WCF fornito con Silverlight (anche se alcune aggiunte sono state apportate nel tempo).

Suppongo perché non è disponibile alcuna riflessione.

Reflection è disponibile e funziona con MonoTouch. Reflection.Emit fa non poiché Apple non consente il codice JIT sui dispositivi iOS. Questo può limitare alcune API che richiedono la generazione di codice in fase di esecuzione (ma non è un problema se la generazione del codice può essere eseguita in fase di compilazione).

... Ciò significa che il codice generato da SVCUTIL.EXE è stato risolto. ...

Combattere/modificare il codice generato è in genere una cattiva idea (ad esempio, la manutenzione futura). Ti suggerisco di provare a utilizzare slsvcutil.exe prima di investire troppo tempo nella personalizzazione del codice generato.

...Che aspetto ha il codice che deve essere scritto in quel metodo?

Il codice sorgente completo per Mono di System.ServiceModel e System.ServiceModel.Web sono disponibili se si desidera fornire il proprio canale (o personalizzare il codice generato).

Totalmente poco chiaro per me: qual è la differenza tra le due utilità di servizio?

Il SL prefisso, in slsvcutil.exe, è per Silverlight. Microsoft ha creato questo strumento per generare codice che utilizzerà solo il sottoinsieme WCF disponibile in Silverlight. Poiché questo è lo stesso sottoinsieme supportato da MonoTouch, questo è lo strumento migliore da utilizzare.

Se viene risolto il problema dello spazio dei nomi, gli stub creati tramite l'utilità Silverlight renderanno il mio progetto funzionante o risentiranno anche del problema del canale generico?

E dovrebbe lavoro. È così che le persone stanno usando (il sottoinsieme disponibile di) WCF con MonoTouch oggi. Se ci sono problemi con questo (sottoinsieme/strumento) è possibile compilare un rapporto bug (con un caso di test) e daremo un'occhiata a questo.

+0

Grazie Sebastien per questa risposta dettagliata! Ho aggiunto altri due punti sopra. Se trovi il tempo, forse puoi commentare anche tu? – Krumelur

+0

Accettato come la maggior parte dei punti ha risposto, la discussione continua nella mailing list Monotouch. – Krumelur