2011-03-16 5 views
6

Dire que j'ai contrat de service WCF comme celui-ciWCF Duplex contrat

[ServiceContract(CallbackContract = typeof(ICallback1), 
SessionMode = SessionMode.Required)] 
public interface IService1 
{ 
    // some methods 
} 

La mise en œuvre de service a InstanceContextMode.Single fixé pour InstanceContextMode et ICallback1 est quelque chose comme

public interface ICallback1 
{ 
    [OperationContract] 
    void Report(int someValue); 
} 

Maintenant, côté client, je peux avoir une classe les implements ICallback1 aiment

class Callback1 : ICallback1 
{ 
    public void Report(int someValue) 
    { 
     // alert client 
    } 
} 

et je créer référence de service client comme celui-ci

Service1Client serviceClient = new Service1Client(new InstanceContext(new CallBack1())); 

qui fonctionne très bien. Maintenant, le problème est que j'ai quelques clients qui ne sont pas intéressés par le rappel, donc je pensais que je ne demande pas d'implémenter l'interface de rappel pour ces clients, donc j'essayé

Service1Client serviceClient = new Service1Client(null); 

et

Service1Client serviceClient = new Service1Client(new InstanceContext(null)); 

les deux ont rapporté que le parameter cannot be null. Ma question est, comment puis-je créer une référence de service sans passer un objet de rappel si le client n'est pas intéressé par le rappel. La seule exigence est que tous les clients doivent parler au même service mais sinon je peux restructurer le service. Des pensées ?

EDIT:

J'ai aussi essayé SessionMode = SessionMode.Allowed pour ServiceContract au lieu de SessionMode.Required, mais cela n'a pas aidé non plus.

+0

Cela semble impossible tant que cela fait partie du contrat. –

+0

Le contrat de rappel peut-il être facultatif? –

+0

En termes simples, le rappel est défini comme une partie du contrat de service, c'est constant. Configurer tout le reste ne change pas le contrat, il semble donc impossible. –

Répondre

2

Solution de contournement: supprimez le CallbackContract de IService1. Créez IDuplexService1 qui hérite IService1 et contient le CallbackContract. Avez Service1Client implémenter IDuplexService1. Lors de l'instanciation de l'hôte, appelez ServiceHost.AddServiceEndpoint pour IService1 et IDuplexService1.