2009-06-05 8 views
2

Je suis en train de prototyper une application avec WCF et j'essaie de définir un contrat avec une interface qui dérive d'une autre. Ce faisant, le code proxy généré (en utilisant svcutil.exe) ne voit pas l'interface de base et une exception NotSupportedException est lancée sur le serveur lors de l'essai pour appeler les méthodes définies dans l'interface de base.Contrats hérités de contrat WCF

J'ai également essayé de définir manuellement l'interface de base dans la classe de proxy afin de pouvoir implémenter les méthodes dans le client -> Même comportement.

Est-ce que quelqu'un sait pourquoi cela ne fonctionne pas?

Merci pour toute aide et désolé pour le republier!

Voici ma définition du contrat:

namespace wcfContract 
{ 

    [ServiceContract(Namespace = "Test")] 
    public interface IPing 
    { 
     [OperationContract] 
     void Ping(); 
    } 

    public interface ITestCallback : IPing  
    //<-------------- IPing method not seen at all in proxy 
    { 
     [OperationContract] 
     void TestCB(); 
    } 

    [ServiceContract(Namespace = "Test", CallbackContract = 
     typeof(ITestCallback))] 
    public interface ITest : IPing 
    { 
     [OperationContract] 
     void Test(); 
    } 
} 

Répondre

6

Vous devez ajouter l'attribut [ServiceContract] à l'interface ITestCallback.

[ServiceContract] 
public interface ITestCallback : IPing 
{ 
    [OperationContract] 
    void TestCB(); 
} 

La classe de service doit hériter du contrat dérivé (c'est-à-dire ITestCallback).

public class Service1 : ITestCallback 
{ 
    ... 
} 

Le critère d'évaluation correspondant de liaison dans le fichier web.config doit spécifier le contrat correct (comme dans l'adresse de point de terminaison pour « ws » ci-dessous).

<services> 
    <service name="WcfService.Service1" behaviorConfiguration="WcfService.Service1Behavior"> 
    <!-- ITestCallback needs to be the contract specified --> 
    <endpoint address="ws" binding="wsHttpBinding" contract="WcfService.ITestCallback"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
</services> 

Cela a fonctionné pour moi; J'espère que ça marche pour toi. Je n'ai pas utilisé svcutil, je viens de référencer en ajoutant une référence de service dans un projet.

+0

Merci beaucoup! –

2

Avez-vous essayé d'ajouter [ServiceContract] tag à ITestCallback?

+0

J'ai fait - en vain. –

Questions connexes