Предоставление подклассов WCF на основе абстрактного класса - PullRequest
4 голосов
/ 06 марта 2009

У меня есть абстрактный класс, который я хотел бы предоставить 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();
}

При использовании Родителя в качестве типа услуги я получаю
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.

1 Ответ

8 голосов
/ 06 марта 2009

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

Редактировать: Хорошо, теперь вам нужно изменить ваш метод RunService на это ниже. Тип контракта, если IWcfClass, а не Child или 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();
}
...