2010-09-22 76 views
1

我想从位于WCF服务中的类继承。继承工作正常(我看到我的子类中的基类的属性),当我尝试从服务调用方法并将childtype作为参数传递而不是基类型时,会发生问题。在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; } 
    } 
} 

类客户端(从PetDog继承):

[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我无法设置KnownTypeServiceKnownType属性。

有人可以帮我吗?

回答

2

我觉得这是非常类似这样的问题:Service - client interface, architecture advice

正如你所看到的,有没有真正简单的方法来做到这一点没有让你的服务操作更通用。

+0

谢谢,我会试一试。 – danjov 2010-09-22 12:59:05

+0

嗨,@stombeur,也许你可以看看这里吗?http://stackoverflow.com/questions/42294978/lack-of-sent-field-from-sublcass-in-wcf-trying-to-gain-polymorphism?noredirect = 1个#comment71750175_42294978 – 2017-02-17 13:48:42

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运行时所知 - 通过检查.NET类型继承,WCF无法弄清楚这一事实。

+0

谢谢你的回答。我会尽我所能解释它,但我不能,因为WCF服务一定不知道额外的类型。我会尝试一般的解决方案。 – danjov 2010-09-22 12:58:39

+0

@marc_s可以看这里吗? http://stackoverflow.com/questions/42294978/lack-of-sent-field-from-sublcass-in-wcf-trying-to-gain-polymorphism?noredirect=1#comment71750175_42294978我有非常类似的问题 – 2017-02-17 13:47:46