2010-09-22 77 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