2011-10-16 3 views
21

Sono nuovo di WCF. Inizialmente ho creato un servizio WCF e usato il proxy client generato per consumare il servizio dal client. Quindi ogni volta che eseguivo alcune operazioni sul servizio, tutto veniva eseguito in modo sequenziale mentre invocavo le operazioni in modo sincrono. Ho cambiato la modalità di concorrenza in più, ma le operazioni sono comunque avvenute in modo sincrono. Poi ho generato metodi asincroni per le mie operazioni e ho utilizzato i pattern di inizio/fine in modo tale da indovinare "liberato" il canale e lasciare che le operazioni avvengano in parallelo/aumentando in modo asincrono il throughput delle mie applicazioni.WCF - fabbrica canale vs base client

Quindi ho utilizzato ChannelFactory per creare un canale ed eseguito le operazioni in quanto client e server possono condividere i contratti (stesso progetto). Ma IClientChannel fornisce solo BeginOpen/EndOpen/BeignClose/EndClose. Non dispone dei metodi BeginOperation/EndOperation . Quindi in pratica non riesco a eseguire un'operazione in modo asincrono sul canale per liberare così posso usare il canale per eseguire altre operazioni.

L'ho semplicemente creato canali per ogni operazione e risolto il problema

Quindi la mia domanda è:

  1. Che è meglio (ClientBase vs. ChannelFactory) rispetto al mio scenario soprattutto voglio eseguire più operazioni sull'oggetto servizio contemporaneamente con più thread

  2. È consigliabile creare un canale per ogni singola operazione?

  3. Infatti, ho pensato che possiamo avere un solo canale tra due endpoint (client/servizio). Ma posso creare tutti i canali che voglio. Ad esempio: sono stato in grado di creare Int16.MaxValue dei canali. Quindi non sono sicuro di quale sia il limite e le raccomandazioni su questo.

    Service[] channels = new IService[Int16.MaxValue]; 
    
    for(int i = 0; i<Int16.MaxValue; i++) 
    { 
        channels[i] = factory.CreateChannel(); 
    } 
    

Quindi, in pratica si può per favore fatemelo sapere circa i principi fondamentali di canali e consigli e trucchi ecc ... ecc .. :)

risposta

26

C'è una differenza tra il utilizzando async ClientBase e ChannelFactory<T>. Fondamentalmente, ClientBase utilizza il modello asincrono basato su eventi.

Ho utilizzato ChannelFactory<T> estesamente in un'applicazione che ho sviluppato sul posto di lavoro, principalmente perché i contratti erano disponibili in una libreria comune per l'applicazione e non mi piace utilizzare l'opzione Aggiungi riferimento servizio. Memorizzo ogni istanza unica di ChannelFactory durante la creazione e, quando ho bisogno di chiamare un'operazione, apro un canale di comunicazione da quell'istanza, effettuo la chiamata e chiudo il canale di comunicazione.

La maggior parte del costo di avvio per WCF è nella creazione del client, e in questo modo si paga solo una volta per tutta la vita dell'applicazione - la creazione di canali di comunicazione è banale.

Per maggiori informazioni sul asincrona per ClientBase e ChannelFactory<T>, vedi:

How to: Call WCF Service Operations Asynchronously

How to: Call Operations Asynchronously Using a Channel Factory

+0

Grazie Tim. Sì, sto anche facendo praticamente la stessa cosa. Creare un nuovo canale di comunicazione per ogni operazione e chiuderlo. Ho guardato i collegamenti, ma ho ancora alcune domande.1. Quanti canali sono raccomandati? 2. Per eseguire le operazioni in modo sincrono utilizzando la factory di canale, è sufficiente aggiungere i metodi BeginOp/EndOp all'interfaccia del canale. resto tutto è curato da WCF - in altre parole svcutil util genera così tanto codice che non ci interessa. ci interessa solo la definizione dell'interfaccia e lasciamo che il WCF faccia il grande lavoro. Se sì, questo è bello. \ – Dreamer

+0

Domande oltre a quelle sopra? – Tim

+0

@Dreamer - Non penso che ci sia un numero raccomandato di canali. Se disponi di molti client, potresti riscontrare problemi di connessione concomitanti, ma puoi modificarlo nella configurazione. Per quanto riguarda la tua seconda domanda, non ho ancora fatto nulla di asincrono in WCF (ci stiamo preparando a farlo nel nostro prossimo turno di lavoro), ma penserei che se l'interfaccia è corretta, dovresti essere ok. – Tim