2009-03-05 2 views
4

У меня есть абстрактный класс, который я хотел бы предоставить в WCF, чтобы любые подклассы также могли быть запущены как служба WCF.
Это то, что я до сих пор:Воздействие подклассов WCF на основе абстрактного класса

[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){...} 
} 

При попытке создать службу в моем коде я использую этот метод:

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(); 
} 

При использовании Parent как тип сервиса я получаю
The contract name 'Parent' could not be found in the list of contracts implemented by the service 'Parent'. ИЛИ Service implementation type is an interface or abstract class and no implementation object was provided.

и при использовании ребенка в качестве типа сервиса я получаю
The service class of type Namespace.Child both defines a ServiceContract and inherits a ServiceContract from type Namespace.Parent. Contract inheritance can only be used among interface types. If a class is marked with ServiceContractAttribute, then another service class cannot derive from it.

Есть ли способ опубликовать функции в классе Child, поэтому мне не нужно специально добавлять атрибуты WCF?

Редактировать
Так что

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

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

с запуском службы с ребенком возвращается
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

Если родитель реализует IWcfClass, а Child расширяет родительский, ребенку также не нужно реализовывать IWcfClass. –

ответ

8

Договор на обслуживание, как правило, интерфейс, а не класс. Поместите контракт в интерфейс, предложите абстрактный класс реализовать этот интерфейс и сообщите нам, что происходит, когда вы используете Child для запуска службы.

Редактирование: Хорошо, теперь вам нужно изменить метод RunService ниже. Тип контракта, если IWcfClass, а не дочерний или родительский.

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

Спасибо за ввод, но он все равно не работает, если я не реализовал его правильно. Я добавил изменения в вопрос в редактирование, чтобы было легче читать. – bju1046

+0

также атрибуты [OperationContract] и [Web *] должны находиться в пространстве имен, а не в родительском или дочернем классе. – bju1046