【问题标题】:Inherit from a class in a wcf service从 wcf 服务中的类继承
【发布时间】:2010-09-22 12:18:22
【问题描述】:

我想从位于 WCF 服务中的类继承。继承工作正常(我在子类中看到基类的属性),当我尝试从服务调用方法并将子类型作为参数而不是基类型传递时,就会出现问题。

WCF 服务中的基类 (Pet):

[ServiceContract]
public interface IService
{
    [OperationContract]
    void BringPet(Pet pet);

    [OperationContract]
    void TakePet(Pet pet);

    [OperationContract]
    List<Pet> GetAllPets();
}

[DataContract]
public class Pet
{
    private string _name;
    private string _color;

    [DataMember]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    [DataMember]
    public string Color
    {
        get { return _color; }
        set { _color = value; }
    }
}

客户端上的类(Dog 继承自 Pet):

[DataContract()]
class Dog : PetService.Pet
{
    [DataMember()]
    public bool HasPedigree { get; set; }
    [DataMember()]
    public string Race { get; set; }
}

当我尝试这样调用时:

        Dog dog = new Dog()
        {
            Color = "Black",
            Name = "Pluto",
            HasPedigree = true,
            Race = "Travolta"
        };

        _client.BringPet(dog);

我得到一个CommunicationException,它表示BringPet(Pet pet) 方法不需要类型Dog。 我会通过在服务端设置KnownType 属性来解决这个问题,但是因为我的服务一定不知道Dog 的类型,所以我无法设置KnownTypeServiceKnownType 属性。

谁能帮帮我?

【问题讨论】:

    标签: c# .net wcf inheritance


    【解决方案1】:

    如果您希望返回的继承类而不是服务合同中定义的类,则需要通过 ServiceKnownType 属性让 WCF 知道这一事实:

    [ServiceContract]
    [ServiceKnownType(typeof(Dog))]
    public interface IService
    {
        [OperationContract]
        void BringPet(Pet pet);
    
        [OperationContract]
        void TakePet(Pet pet);
    
        [OperationContract]
        List<Pet> GetAllPets();
    }
    

    这基本上告诉 WCF 服务也允许在您的服务中使用类型为 Dog 的类。

    或者您可以使用KnownType 属性装饰您的数据合约:

    [DataContract]
    [KnownType(typeof(Dog))]
    public class Pet
    {
    .....
    }
    

    将您的数据合同类型与可用于其位置的其他类型相关联。

    一种方法或另一种方法:您必须让 WCF 运行时知道您的额外类型 - WCF 无法仅通过检查 .NET 类型继承来确定这一事实。

    【讨论】:

    • 感谢您的回答。我会完全按照你的解释去做,但我不能,因为 WCF 服务一定不知道额外的类型。我会尝试通用解决方案。
    • @marc_s 可以看这里吗? stackoverflow.com/questions/42294978/…我也有类似的问题
    【解决方案2】:

    我认为这与这个问题非常相似:Service - client interface, architecture advice

    正如您将看到的那样,如果不使您的服务操作更加通用,就没有真正简单的方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 2011-05-29
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多