我想从位于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
,表示方法Dog
不期望类型BringPet(Pet pet)
。
我可以通过在服务端设置KnownType
属性来解决此问题,但由于我的服务必须不知道类型Dog
,因此我无法设置KnownType
或ServiceKnownType
属性。
有人能帮助我吗?
答案 0 :(得分:4)
如果您希望获得返回的继承类而不是服务合同中定义的类,则需要通过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类型继承来解决这个问题。
答案 1 :(得分:2)
我认为这与这个问题非常相似:Service - client interface, architecture advice
正如您将看到的,如果不使您的服务操作更通用,就没有简单的方法可以做到这一点。