2009-02-04 11 views
24

In einem WCF-Dienst habe ich zwei Klassen mit dem Attribut [DataContract]. Eine dieser Klassen hat eine "ist-a" -Beziehung mit der anderen Klasse. Daher kann Klasse B von Klasse A erben. Wenn ich jedoch die Vererbung zwischen diesen beiden Klassen, die beide mit einem [DataContract] -Attribut gekennzeichnet sind, konfigurieren, können die Metadaten nicht geladen werden beim Testen der Dienste.Können in WCF Datenvertragsklassen von einander erben?

Ist dies in WCF möglich? Fehle ich ein anderes Attribut?

HINWEIS: Die benutzerdefinierten Typen werden auch mithilfe von Datenverträgen definiert.

UPDATE: Unten ist der Fehler:

Error: Cannot obtain Metadata from http://localhost:8002/GISDataServices/mex If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8002/GISDataServices/mex Metadata contains a reference that cannot be resolved: ' http://localhost:8002/GISDataServices/mex '. Receivera:InternalServiceFault The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework 3.0 SDK documentation and inspect the server trace logs.HTTP GET Error URI: http://localhost:8002/GISDataServices/mex There was an error downloading ' http://localhost:8002/GISDataServices/mex '. The request failed with HTTP status 400: Bad Request.

UPDATE 2: Siehe meine Antwort unten.

Antwort

38

Ja, aber Sie müssen die Basisklasse mit dem [KnownTypeAttribute] dekorieren, indem Sie sie mit dem Typ der abgeleiteten Klasse konstruieren. Zum Beispiel:

[DataContract] 
[KnownType(typeof(B))] 
public class A 
{ 
    [DataMember] 
    public string Value { get; set; } 
} 

[DataContract] 
public class B : A 
{ 
    [DataMember] 
    public string OtherValue { get; set; } 
} 
+0

Dies scheint nicht zu funktionieren. Ich bekomme immer noch einen Fehler beim Laden der Metadaten. –

+0

Was ist der Fehler, den Sie sehen? –

+0

Große Frage. Können Sie Ihren genauen Fehler posten? –

1

Basierend auf diesem Test sollte es gut funktionieren. Haben beide Klassen Standardkonstruktoren? Verwenden Sie Auto-Eigenschaften. Hinweis: In diesem Basisbeispiel sind die Attribute nicht erforderlich. Da David Morton Sie erwähnte, abhängig davon, welches Element Sie zurückgeben, benötigen Sie möglicherweise das KnownType-Attribut. Ich bin nicht 100%, aber der bekannte Typ muss möglicherweise auf den Operationsvertrag gesetzt werden.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var serializer = new DataContractSerializer(typeof(Employee)); 

     var employee = new Employee() { Name="Joe", Salary=100000 }; 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, employee); 

      ms.Position = 0; 

      var newEmployee = serializer.ReadObject(ms) as Employee; 
     } 

     Console.ReadKey(); 

    } 
} 

[DataContract] 
public class Employee : Person 
{ 
    [DataMember] 
    public decimal Salary { get; set; } 
} 

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

[ServiceContract] 
interface IEmployeeService 
{ 
    [OperationContract] 
    Person GetPerson(); 

    [OperationContract] 
    Employee GetEmployee(); 

    [OperationContract] 
    [KnownType(typeof(Employee))] 
    Person GetEmployeeAsPerson(); 
} 
+0

Ich verwende Auto-Eigenschaften, aber diese funktionieren gut, wenn ich das Vererbungskonstrukt entfernen. –

+0

Keine der Klassen verwendet einen expliziten Konstruktor. –

+0

Können Sie Ihren Beitrag mit dem Problem Vererbungskonstrukt aktualisieren? – bendewey

7

Okay, ich habe die Frage herausgefunden. Die Antwort ist ... Ich bin ein Idiot. Es hatte nichts mit Erbschaft zu tun. In der Basisklasse hatte ich einen Datenvertragsmitglied ohne eine Set-Property-Klausel - nur ein "Get". Dah !!! Wenn man eine "Satz" -Klausel einführte, funktionierte es wie ein Zauber.

Sorry für die Verwirrung.

Verwandte Themen