2008-11-21 10 views
19

Ich experimentiere mit WCF-Diensten und stoße auf ein Problem mit der Übergabe von Schnittstellen.Übergeben Schnittstelle in einem WCF-Dienst?

Dies funktioniert:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    string GetString(); 
} 

aber nicht:

[ServiceContract] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Wenn ich versuche, den Client es nicht auf der GetInterface Methode zu kompilieren. Ich bekomme eine Exception, die besagt, dass das Objekt nicht in IDevice konvertiert werden kann.

Auf der Clientseite implementiert die IHomeService-Klasse GetString korrekt mit einem String als Returnntype, aber das GetInterface hat einen returntype des Objekts. Warum ist es nicht IDevice?

Antwort

20

Sie benötigen die WCF Serializer welche Klasse zu sagen, zu verwenden, um die Schnittstelle

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Es tut mir leid, aber ich glaube nicht, dass ich verstehe. Angenommen, die GetInterface-Methode soll zwei verschiedene Klassen zurückgeben, SimpleDevice und AdvancedDevice, die beide die IDevice-Schnittstelle implementieren. Sollte ich dann ServiceKnownType für beide Typen festlegen? –

+1

Wie erkennt WCF bei der Deserialisierung, welchen Implementierungstyp von IHomeService verwendet wird? – Will

+1

Ja, ich glaube du hast es verstanden. Sie teilen WCF die möglichen Typen mit, die die Schnittstelle implementieren. Sie können jeden beliebigen Typ übergeben, solange WCF weiß, dass diese bekannten Typen die Schnittstelle implementieren und serialisierbar sind. –

9

Dank zu serialisiert, es funktioniert, wenn ich es so geändert:

[ServiceContract] 
[ServiceKnownType(typeof(PhotoCamera))] 
[ServiceKnownType(typeof(TemperatureSensor))] 
[ServiceKnownType(typeof(DeviceBase))] 
public interface IHomeService 
{ 
    [OperationContract] 
    IDevice GetInterface(); 
} 

Ich habe auch Hilfe von dieser Seite: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

+0

Danke für dieses Beispiel! –

+1

Link ist jetzt 404, aber einige Suchmaschinen haben es zwischengespeichert – noonand

+0

Frode: Glaubst du nicht, dass @Brian tatsächlich deine Frage beantwortet? –

1

Ich versuchte zunächst, eine Schnittstelle an eine WCF-Methode zu übergeben, konnte jedoch den Code nicht mit den Antworten auf diesem Thread arbeiten funktionieren. Am Ende habe ich meinen Code überarbeitet und eine abstrakte Klasse an die Methode und nicht an eine Schnittstelle übergeben. Ich habe das mit dem KnownType-Attribut für die Basisklasse, z.

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData 
Verwandte Themen