2009-03-05 9 views
4

J'ai une classe abstraite que j'aimerais pouvoir exposer à WCF afin que toutes les sous-classes puissent également être démarrées en tant que service WCF.
C'est ce que j'ai jusqu'à présent:Exposer des sous-classes WCF basées sur une classe abstraite

[ServiceContract(Name = "PeopleManager", Namespace = "http://localhost:8001/People")] 
[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
[DataContract(Namespace="http://localhost:8001/People")] 
[KnownType(typeof(Child))] 
public abstract class Parent 
{ 
    [OperationContract] 
    [WebInvoke(Method = "PUT", UriTemplate = "{name}/{description}")] 
    public abstract int CreatePerson(string name, string description); 

    [OperationContract] 
    [WebGet(UriTemplate = "Person/{id}")] 
    public abstract Person GetPerson(int id); 
} 

public class Child : Parent 
{ 
    public int CreatePerson(string name, string description){...} 
    public Person GetPerson(int id){...} 
} 

Lorsque vous essayez de créer le service dans mon code que j'utilise cette méthode:

public static void RunService() 
{ 
    Type t = typeof(Parent); //or typeof(Child) 
    ServiceHost svcHost = new ServiceHost(t, new Uri("http://localhost:8001/People")); 
    svcHost.AddServiceEndpoint(t, new BasicHttpBinding(), "Basic"); 
    svcHost.Open(); 
} 

Lorsque vous utilisez Parent comme le type de service que je reçois
The contract name 'Parent' could not be found in the list of contracts implemented by the service 'Parent'. OU Service implementation type is an interface or abstract class and no implementation object was provided.

et lorsque vous utilisez l'enfant comme le type de service que je reçoisY at-il un moyen d'exposer les fonctions dans la classe Child afin que je n'aie pas besoin d'ajouter spécifiquement les attributs WCF?

Modifier
donc ce

[ServiceContract(Name= "WCF_Mate", Namespace="http://localhost:8001/People")] 
    public interface IWcfClass{} 

    public abstract class Parent : IWcfClass {...} 
    public class Child : Parent, IWcfClass {...} 

avec le démarrage du service avec l'enfant retourne
The contract type Namespace.Child is not attributed with ServiceContractAttribute. In order to define a valid contract, the specified type (either contract interface or service class) must be attributed with ServiceContractAttribute.

+0

si le parent met en œuvre IWcfClass, et l'enfant s'étend parent, enfant n'a pas besoin de mettre en œuvre IWcfClass aussi bien. –

Répondre

8

Le contrat de service est généralement une interface, pas une classe. Placez votre contrat dans une interface, demandez à la classe abstraite d'implémenter cette interface et faites-nous savoir ce qui se passe lorsque vous utilisez Child pour démarrer le service. Editer: Ok, maintenant vous devez modifier votre méthode RunService à ceci ci-dessous. Le type de contrat si IWcfClass, pas Enfant ou Parent.

public static void RunService() 
{ 
     Type t = typeof(Child); 
     ServiceHost svcHost = new ServiceHost(t, new Uri("http://localhost:8001/People")); 
     svcHost.AddServiceEndpoint(typeof(IWcfClass), new BasicHttpBinding(), "Basic"); 
     svcHost.Open(); 
} 
+0

Merci pour l'entrée, mais cela ne fonctionne toujours pas, sauf si je ne l'ai pas implémenté correctement. J'ai ajouté les modifications à la question dans une édition afin qu'il soit plus facile à lire. – bju1046

+0

également les attributs [OperationContract] et [Web *] doivent être dans l'espace de noms, pas dans la classe parent ou enfant. – bju1046