2011-12-13 13 views
7

Ho problemi/domande che chiudono un canale di comunicazione callback/duplex. Qui sono i miei prototipi di interfacce WCF:Interfaccia di richiamo WCF - Chi chiude il canale

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))] 
public interface IMyInterface 
{ 
    [OperationContract] 
    void StartWork(); 
} 

public interface IMyInterfaceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void WorkFeedback(); 
} 

Sul lato client Creo il mio interfaccia WCF tramite:

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea); 
IMyInterface myInterface = dcf.CreateChannel(); 

Sul lato server, allora io uso

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>(); 

per recuperare il puntatore di callback, che può quindi essere utilizzato per comunicare con il client.

Le mie domande ora sono:

  1. Chi dovrebbe chiudere il canale di comunicazione? Il client o il server
  2. Quali oggetti di comunicazione devono essere chiusi? L'interfaccia originale (IMyInterface) o l'interfaccia di callback (IMyInterfaceCallback) o entrambi.

Ho provato a chiudere l'interfaccia di callback sul lato server, nel momento in cui il server sa che non farà più callback. L'uso di ICommunicationObject :: Close sull'interfaccia di callback ha tuttavia comportato un'operazione di blocco di un minuto.

Chiudere sul lato client a mio parere non è il modo giusto, in quanto il client non sa se ci sono più callback da aspettarsi.

Grazie per qualsiasi aiuto. Frank

PS: Questo sembra essere una domanda molto semplice, ma finora ho trovato alcuna informazione utile durante la ricerca tramite google o StackOverflow ...

risposta

3

Il DuplexChannel utilizza una connessione TCP sotto il cofano, ed è così che emula una comunicazione bidirezionale. Tuttavia, il client è chi apre sempre quella connessione, quindi è anche responsabile della chiusura (Think in a socket TCP). Pertanto, è necessario utilizzare l'interfaccia client IMyInterface (che deriva da IClientChannel) per chiuderla.

Saluti Pablo.

6

Il client deve chiudere il canale di servizio (normalmente).

Il canale di callback acquisita attraverso GetCallbackChannel NON deve essere chiuso nella mia esperienza (Vedere questa domanda relativa mia: Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?)

Quando si chiude il canale che si deve usare il modello preferito:

Try 
    channel.Close() 
Catch ex As Exception 
    channel.Abort() 
End Try 

Perché il client (di solito) non può sapere se sono ancora in corso messaggi durante il tentativo di chiudere il canale, il che comporterebbe un'eccezione.

+0

Grazie per le informazioni, sto chiudendo il canale sul lato client e tutto va bene. Sto comunque controllando lo stato prima della chiusura, ad es. se Faulted quindi chiama direttamente Abort(). Ma anche il tuo codice di chiusura dovrebbe funzionare correttamente. – FrankE

Problemi correlati