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.
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. –