c# - 从 wcf 服务中的类继承

标签 c# .net wcf inheritance

我想继承一个位于 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 属性。

有人可以帮帮我吗?

最佳答案

如果您想要返回的继承类而不是服务契约中定义的类,您需要通过 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 类型继承来确定这一事实。

关于c# - 从 wcf 服务中的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3769095/

相关文章:

c# - ListView中的自定义ListViewItem

wcf - WCF NetTCPBinding 中的二进制序列化

c# - 使用 SharpSVN api 是否有任何方法可用于在不导出文件的情况下获取修订版文件中包含的行数?

c# - 使用 HTTPCLient 下载文件时减少内存占用

c# - 为什么 Contains 比较对象与 == 不同?

asp.net - dotnet 框架 4.5.2 的生命周期何时结束

c# - 限制 Listview 中 C# 中 DataGridView 中的重复值?

c# - 如何在 Wcf 服务上抛出异常并在客户端捕获它?

c# - WCF 元数据缺少操作

c# - 无法通过应用程序下载 .7z 扩展文件