我想继承一个位于 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
我不能设置 KnownType
或 ServiceKnownType
属性。
有人可以帮帮我吗?
最佳答案
如果您想要返回的继承类而不是服务契约中定义的类,您需要通过 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/