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:
- Chi dovrebbe chiudere il canale di comunicazione? Il client o il server
- 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 ...
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