2013-03-04 33 views
8

Sono confuso riguardo al proxy e ai canali. Secondo la mia lettura, il client WCF sta usando un proxy che trasmette il messaggio attraverso una catena di canali. Ogni canale è responsabile di determinati compiti, ad esempio un canale sta codificando il messaggio e un altro canale lo sta crittografando.Confusione sui canali WCF

La mia confusione inizia quando ho visto il seguente codice

  • Quando proxy.MyMethod() si chiama, in realtà chiamato l'intera catena di canali?

  • L'autore ha utilizzato il metodo denominato CreateChannel e ha denominato il proxy di identificazione. Quindi nell'architettura WCF Proxy è solo un canale di alto livello spaziale, non è un elemento di architettura autonomo?

    Binding binding = new NetTcpBinding(); 
    EndpointAddress address = new EndpointAddress("net.tcp://localhost:8000"); 
    IMyContract proxy = ChannelFactory<IMyContract>.CreateChannel(binding,address); 
    using(proxy as IDisposable) 
    { 
        proxy.MyMethod(); 
    } 
    

risposta

3

Sì, penso che hai descritto questo con precisione. WCF ha questo concetto di "canali", , che gli sviluppatori tendono a configurare nel web.config e non scrivere codice C# intorno.

Questi sono descritti nello Channel Model Overview.

Quando si chiama ChannelFactory.CreateChannel(binding,address);, il framework esamina la configurazione e crea tutti questi canali come un unico oggetto. Quindi sì, il proxy è come una pila di canali.

Dalla tua parte interagisci con esso come un unico oggetto. Il framework si occupa dell'implementazione di canali separati. È ancora bello capire che stai attraversando questi livelli in modo che li puoi configurare correttamente.

10

In WCF si dispone di 3 componenti principali: Contratto, Indirizzo e Rilegatura. Il canale è una pipa, che sta costruendo in base a queste tre parti.

enter image description here

L'obiettivo del canale è quello di modificare il messaggio in formato, che sia comprensibile per entrambi - client e server, e per organizzare il trasporto è corretto. I canali di trasporto e di protocollo sono utilizzati per questo. Per semplificare questo processo, utilizziamo i collegamenti. Ogni associazione consiste di elementi che rappresentano un canale nella pila di canali.

Quindi, ogni volta che si chiama il metodo, forma il messaggio in base al proprio DataContract e lo passa attraverso l'intera catena di canali. Ogni canale modifica il tuo messaggio. I prosses sembra questo

enter image description here

Un WCF Proxy è in realtà solo un livello di astrazione. Rappresenta in-process di un servizio out-of-process. Potete immaginarlo come un oggetto, generato e configurato correttamente in base ai vostri elementi di binding e al vostro dataContract, che consente al vostro lato client e lato server di capirsi a vicenda.

0

In questo caso "proxy" è un riferimento al modello di progettazione software. From Wikipedia:

Un proxy, nella sua forma più generale, è una classe di funzionamento come un'interfaccia a qualcos'altro.Il proxy può interfacciarsi a qualsiasi cosa: una connessione di rete , un oggetto di grandi dimensioni in memoria, un file o un'altra risorsa che è costosa o impossibile da duplicare.

Nel caso della WCF ChannelFactory <> .CreateChannel sta creando un channel stack base alla configurazione. Ogni canale fornisce un'astrazione al canale sottostante. Per esempio uno stack di canale potrebbe essere semplificata:

  • canale 1 serializzare l'oggetto .NET in un messaggio SOAP
  • canale 2 Aggiunge informazioni di sicurezza al messaggio
  • canale 3 codificare il messaggio da inviare su TCP .

Penso che tu capisca tutto questo.

Torna all'uso del "proxy": qualsiasi canale nello stack è un proxy per il canale sottostante. Vale a dire che nessun canale è la destinazione finale. Tutti i canali sono "un'interfaccia per qualcos'altro". Tuttavia, mentre ci si sposta verso il basso nello stack dei canali, i diversi canali forniscono un'interfaccia/astrazione diversa (oggetto .NET, messaggio SOAP, ecc.) Al chiamante.

Ancora una volta questa discussione ha lo scopo di rispondere alla domanda e intenzionalmente semplificata.

Quando si scrive codice client, l'interfaccia più utile è quella che comprende gli oggetti .NET. Sapendo ciò, ChannelFactory restituisce il canale che si trova in cima allo stack con un'interfaccia .NET che corrisponde al contratto di servizio. Sarebbe valido creare un messaggio SOAP come una stringa, scendere lungo lo stack di canali (o creare uno stack personalizzato), trovare il canale che accetta un messaggio SOAP non elaborato, etichettarlo come "proxy" e chiamarlo direttamente.

L'autore ha utilizzato il metodo denominato CreateChannel e ha denominato l'identificatore proxy. Quindi nell'architettura WCF Proxy è solo un canale speciale di alto livello , non è un elemento di architettura autonomo?

Il canale è un elemento architettonico che implementa il modello di progettazione del software proxy. Tutti i canali sono proxy. Quando si scrive codice client, il canale di primo livello risulta essere il più utile in quanto accetta i contratti operativi .NET.