2009-03-13 9 views
3

Ich habe dieses ServicecontractWCF und Subklassen

[OperationContract(IsOneWay=true)] 
void ProcessMessage(Message message); 

und diese Objekte

[DataContract] 
public class Message 
{ 
    [DataMember] 
    public long Id { get; set; } 

    [DataMember] 
    public string Body { get; set; } 
} 

[DataContract] 
public class ExtendedMessage : Message 
{  
    [DataMember] 
    public NameValueCollection AdditionalData { get; set; } 
} 

Will WCF der Lage zu handhaben sein, wenn ich in der Unterklasse an den Service-Methode übergeben? Oder werden alle zusätzlichen Eigenschaften gelöscht, die nicht in der Basisklasse enthalten sind?

ExtendedMessage msg = new ExtendedMessage(); 
... 
ProcessMessage(msg); 
+0

Haben Sie diesen Effekt erzielt? Ich beschäftige mich lange mit diesen Themen. Ist es möglich in [OperationContract] HandleData (Base base) zu haben; und von SoapUI einige von Base gesuchte Objekte senden? Und dann, wenn C# wird Tatsache bewusst, dass auf der Basis ist es Hold-Instanz einer Unterklasse - so rufen Sie auch richtige Methoden (Polymorphismus und so weiter) –

Antwort

3

Ich denke, wenn Sie nicht ExtendedMessage über das Knowntype Attribut angegeben haben, würden Sie einen Fehler. Sobald Sie WCF über ExtendedMessage über KnownType informiert haben, funktioniert es ohne Datenverlust.

Übrigens müssen Sie die Menge der möglichen Typen zur Kompilierzeit nicht kennen, da das KnownType-Attribut auf eine Methode verweisen kann, die zur Laufzeit die Menge der möglichen Typen zurückgibt.

+0

Ich bin mit diesen Themen eine lange Zeit. Ist es möglich in [OperationContract] HandleData (Base base) zu haben; und von SoapUI einige von Base gesuchte Objekte senden? Und dann, wenn sich C# der Tatsache bewusst ist, dass es auf der Basis eine Instanz einer Unterklasse enthält, so ruft es auch richtige Methoden auf (Polymorphie usw.) –

0

Sie können auch das ServiceKnownType-Attribut verwenden, um den Bereich des KnownType-Attributs einzugrenzen. Sie können das ServiceKnownType-Attribut für einen bestimmten Vorgang oder für Ihren Servicevertrag anwenden.