2011-01-24 15 views
8

Sto provando a scrivere del codice in C# che richiamerà immediatamente un servizio WCF importando il WSDL, esaminandolo e quindi effettuando le chiamate dinamicamente.Chiamare un servizio WCF senza generare un assembly

Il servizio che sto chiamando può cambiare di volta in volta, quindi se lo desidera voglio che il mio cliente sappia nuovi metodi e nuovi parametri di input e parametri di output per le chiamate, senza ricostruire il mio client.

Una possibile soluzione a questo è di importare e compilare un servizio di riferimento al volo.

qui descritte: Creating an assembly on the fly from a WSDL

desidero evitare la generazione di un assieme e poi riflettendo su di esso, se possibile.

Ho esaminato il codice del proxy dinamico nel collegamento e utilizzano una classe framework per eseguire l'importazione. Questa classe è WsdlImporter. Così ho pensato benissimo - posso usarlo ed esaminare lo schema WSDL e determinare quali chiamate sono presenti e quali input e output sono disponibili.

Il problema è che le informazioni sul tipo sono mancanti negli oggetti MessagePartDescription creati da WsdlImporter. Apparentemente questo è mancante because it cannot find the types yet - see the response to the question from Brian.

Quindi qualche consiglio su come dovrei procedere? Sono completamente sulla strada sbagliata qui?

+0

Può fare un esempio reale di come questo sarebbe utile? C'è un'interfaccia utente presentata a un utente del tuo client che consente di selezionare metodi da chiamare, forse una sorta di schedulatore o qualcosa del genere? Inoltre, cosa c'è di sbagliato nel creare un assembly al volo? Sembra abbastanza semplice. Stai immaginando qualcosa di più semplice del riflettere? Ho problemi a immaginare cosa sarebbe. – JohnOpincar

+1

Questo sarà usato per chiamare un servizio WF. Il flusso di lavoro può cambiare - i passaggi possono essere aggiunti/rimossi, ecc. – Neil

+0

@JohnOpincar - La mia obiezione non è la riflessione - è la compilazione al volo dell'assemblea. Sembra che sia un approccio che potrebbe causare problemi di sicurezza ad un certo punto e * potrebbe * essere fragile. Anche a me sembra strano quando tutte le informazioni sono nel WSDL e dato che alla fine le chiamate verranno tutte raccolte in qualcosa che somiglia molto a un'API dinamica che crea un livello dinamico con la riflessione su un livello statico che è stato creato dinamicamente che viene quindi mappato su un livello dinamico è un po 'troppo. Creare l'assembly al volo è il mio piano di backup. – Neil

risposta

5

Questa probabilmente non è una risposta, ma la posterò per descrivere pienamente la mia opinione.

Proxy dinamico:
IMO questo è un esempio di utilizzo errato della tecnologia. È un comportamento elementare di WSDL - se cambia si deve cambiare client o si deve fare un buon versionamento WSDL e creare un nuovo client.

Devi ancora dire in qualche modo al tuo cliente di ottenere WSDL - vuol dire che analizzerai WSDL prima di ogni chiamata? Non sembra una buona idea.

Le informazioni sui tipi non fanno realmente parte di WSDL perché per impostazione predefinita WSDL viene generato come interoperabile. I tipi CLR non sono operazioni necessarie per l'interoperabilità. Quando crei il proxy del servizio tramite Aggiungi riferimento al servizio o Svcutil, genererà il codice per i tipi definiti in WSDL. Quindi quel codice deve essere compilato.

È possibile provare a utilizzare NetDataContractSerializer anziché il valore predefinito DataContractSerializer. NetDataContractSerializer aggiunge le informazioni sul tipo CLR in WSDL, ma mi aspetto ancora che i nuovi tipi debbano essere conosciuti dai client: significa distribuire nuovo assembly con tipi e usarlo dai client. Sembra quasi lo stesso approccio quando si distribuisce semplicemente l'assembly con un nuovo proxy client statico.

dinamica WF cliente
anche io non vedo troppo uso di questa architettura - è comunque necessario cambiare client per riflettere nuovi passi WF, non è vero?

Modifica della WF
Stiamo parlando di Windows Workflow Foundation? Riesco a malapena a immaginare uno scenario in cui si crea WF, esporlo come servizio e quindi modificarlo. Quando esponi WF come servizio, probabilmente stai definendo WF a lungo termine. I file WF a lunga esecuzione usano la persistenza basata sulla serializzazione (almeno in WF 3.5, ma credo che sia la stessa in WF 4).Quando modifichi la definizione WF, tutti i file WF persistenti sono probabilmente condannati perché non verranno mai deserializzati. Questa situazione viene in genere risolta mediante l'implementazione parallela di versioni nuove e vecchie in cui la vecchia versione viene utilizzata solo per completare WF incomplete. Di nuovo significa nuovi clienti.

+0

Grazie per il tuo commento, come dici tu non risolve il mio problema ma lo faccio +1 perché è pensato che provochi - Sono d'accordo con la tua valutazione di WSDL in relazione ai tipi. Tuttavia, se WsdlImporter mi permettesse di vedere quali sono i tipi WSDL, potrei arrivare dove voglio andare. Non ho bisogno del tipo CLR. Vedi il mio prossimo commento riguardante i client dinamici. – Neil

+1

Stiamo parlando di classi WF a lungo termine. Non c'è motivo per cui aggiungere un passaggio al mio flusso di lavoro dovrebbe richiedere la ricostruzione di un client che non esegue quel passaggio. Inoltre, se si desidera creare una dorsale per gestire le interazioni dei client con il flusso di lavoro e avere tutti i client conformi a un'interfaccia standard, è necessario canalizzare tutte le chiamate tramite un'API più stretta rispetto all'API che verrà creata da un servizio WF. – Neil

+0

@Neil: In tal caso, probabilmente andrei in una direzione diversa. Manterrei tutta questa complessità sul lato server. Significa ospitare WF nel tuo processo ed esporre il servizio web con un'interfaccia ben nota preparata per le modifiche WF. È un'idea di alto livello ma dovrebbe essere possibile e sarebbe più semplice di "client di servizi web dinamici". –

1

Se si osserva il problema da un'angolazione diversa. Hai bisogno di rigenerare il proxy ogni volta o hai bisogno di un contratto che continua a funzionare quando le cose cambiano?

WCF ha un meccanismo per questo IExtensibleDataContracts vedere: http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx

Le migliori pratiche per il controllo delle versioni dei contratti si possono trovare here

+0

+1 Grazie per la risposta, potrebbe essere utile per gli altri.Sfortunatamente abbiamo un controllo limitato sul servizio WCF generato da WF, quindi non possiamo davvero seguire questa strada. – Neil

Problemi correlati