2010-08-05 15 views
5

Quale di questi due modi di utilizzare il servizio wcf è migliore? perché?Generazione di wcf proxy vs ChannelFactory

  1. Generazione di proxy dal Servizio di riferimento
  2. utilizzando ChannelFactory

es.

ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(); 
IMyContract proxy1 = factory.CreateChannel(); 
proxy1.MyMethod(); 

E 'un po' noioso per chiamare servizio WCF come so

IMyContract proxy1 = null; 
try 
{ 
    proxy1 = factory.CreateChannel(); 
    proxy1.MyMethod(); 
    ((ICommunicationObject)proxy1).Close(); 
} 
catch 
{ 
    ((ICommunicationObject)proxy1).Abort(); 
} 

Dovremmo ripetere questo frammento di codice per ogni chiamata proxy? Oppure esiste un modo generico per creare una classe wrapper per la chiusura e l'interruzione dei proxy?

sta scrivendo classe come questa ServiceExecution.Execute(proxy=>proxy.MyMethod()); che crea proxy e si chiude o si interrompe è buon modo per farlo?

risposta

3

Here è un post MSDN, che consiglia di non utilizzare i proxy generati in .Net 3 perché crea ogni volta ChanelFactory, .Net 3.5 ChanelFactory è memorizzato nella cache.

Ma personalmente preferisco usare ChanelFactory me stesso, generato il codice è sempre un dolore anche dopo partials uscire

2

Nel primo caso quando si utilizza VS per aggiungere il riferimento del servizio, viene generato tutto il codice per te compreso ServiceContrcats e DataContracts.

Ma quando si utilizza ChannelFactory è necessario disporre già di contratti di servizio ed ecc. Sul lato client.

+0

lo so, ma generati contratti dati non è comodo da usare. Supponiamo di avere 2 servizi, il primo restituisce datacontrat che dovrebbe essere passato al secondo come parametro. in questo caso dovremmo copiare manualmente datacontract, poiché datacontract esiste in 2 diversi namespace –

+0

È ancora possibile modificare il codice generato dal VS. E puoi avere un DataContract separato. – Incognito

+0

La tua modifica andrà persa dopo qualsiasi cambio di servizio e rigenerazione del proxy vero? –

2

io suggerisco di usare l'approccio 1.

ho trovato questo blog con un esempio incluso il codice sorgente che spiega anche come gestire correttamente la connessione (chiusura, interruzione, ecc). Il blog contiene anche collegamenti per ulteriori dettagli su MSDN.

+1

Blog spiega solo come farlo nel primo approccio, ma non dice vantaggi rispetto al secondo. –

+0

@ArsenMkrt: Sì, hai ragione. Ho aggiunto un collegamento a un post di blog che fornisce ulteriori informazioni sull'approccio che ho suggerito nella mia risposta. :-) – Manfred

0

La creazione manuale dei proxy di servizio da un servizio in esecuzione potrebbe essere una buona alternativa. Lo strumento svcutil è ciò che Visual Studio utilizza sotto il cofano quando aggiunge un riferimento al servizio. Utilizzando questo, è possibile generare la classe proxy in una posizione comune, quindi collegarsi ad essa in ogni progetto richiesto e ottenere inoltre un controllo migliore sulle classi proxy.

Ad esempio, per generare un proxy per un servizio chiamato TestService esecuzione localmente sulla porta 8000, si dovrebbe eseguire il seguente nel prompt dei comandi di Visual Studio, generando una classe proxy TestServiceProxy.cs nella directory proxy.

cd "C:\src\proxies" 
svcutil /noLogo /out:TestServiceProxy http://localhost:8000/TestService 

ci sono alcuni altri parametri utili per lo strumento, ad esempio:

Aggiungi /n:*,WcfServices.TestService specificherà uno spazio dei nomi per la classe proxy.

Aggiungi /config:TestServiceProxy.config e svcutil genererà un file di configurazione di esempio per l'utilizzo di TestService incluse terminazioni, attacchi ecc

Aggiungi /r:"Common.dll" e la classe proxy emessa da svcutil non avrà le definizioni per i tipi utilizzati dal servizio, ma definito in l'assembly Common.dll.

Utilizzare svcutil /? per ulteriori informazioni.

+0

'/ config': lo genererà comunque con un nome predefinito output.config. – Rup

+0

Non tutti i casi aziendali sono possibili con la configurazione di svcutil, ad esempio, è possibile generare datacontracts in diversi progetti, servicecontract in different, e il proxy in diversi? non ci credo. –

Problemi correlati