2009-04-17 7 views
0

Ich versuche, ein Objekt aus einer anderen Anwendung mithilfe von WCF zu erhalten. Mit eingebauten Klassen funktioniert es gut, aber ich habe Probleme, wenn ich versuche, einen benutzerdefinierten Schnittstellentyp aus der WCF-Operation zurückzugeben.Problem beim Freigeben benutzerdefinierter komplexer Schnittstellentypen in WCF-Diensten

Ob ich die Schnittstelle in beiden Anwendungen getrennt oder als eine freigegebene Assembly angeben, bekomme ich das gleiche Ergebnis: eine CommunicationException mit der Nachricht "Es gab einen Fehler beim Lesen von der Pipe: Unbekannter Fehler 109".

Die Schnittstelle sieht wie folgt aus:

[ServiceContract] 
public interface IBase { 
    int IntTest { 
     [OperationContract] 
     get; 
    } 
    String StringTest { 
     [OperationContract] 
     get; 
    } 
    IOther OtherTest { 
     [OperationContract] 
     get; 
    } 
} 

[ServiceContract] 
public interface IOther { 
    String StringTest { 
     [OperationContract] 
     get; 
    } 
} 

Mein Server sieht wie folgt aus:

public partial class MainWindow : Window { 
    private Base fb; 
    private ServiceHost host; 

    public MainWindow() { 
     InitializeComponent(); 
     fb = new Base(); 
     host = new ServiceHost(fb, new Uri[] { new Uri("net.pipe://localhost") }); 
     host.AddServiceEndpoint(typeof(IBase), new NetNamedPipeBinding(), 
      "PipeReverse"); 
     host.Open(); 
    } 

    private void Window_Closing(object sender, CancelEventArgs e) { 
     host.Close(); 
    } 
} 

Und hier ist meine Implementierung der Schnittstelle:

[Serializable] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public class Base : MarshalByRefObject, IBase { 
    public int IntTest { 
     get { return 4; } 
    } 

    public string StringTest { 
     get { return "A string from Base"; } 
    } 

    public IOther OtherTest { 
     get { return new Other(); } 
    } 
} 

[Serializable] 
[DataContract] 
public class Other : MarshalByRefObject, IOther { 
    [DataMember] 
    public string StringTest { 
     get { return "A string from Other"; } 
    } 

} 

Der Kunde sieht aus wie dies:

Alles wirkt wie ein Zauber außer dieser Linie:

Console.WriteLine(obj.OtherTest); 

Es gib mir eine Communication mit der Meldung „Es gab einen Fehler aus dem Rohr zu lesen: Nicht erkannte Fehler 109“. Soweit ich das beurteilen kann, ist ein kaputtes Rohr aufgrund eines fehlerhaften Zustands, aber ich kann nicht herausfinden, warum, oder noch wichtiger, wie ich es beheben kann. Irgendwelche Ideen?

Ich habe keine Konfigurationsdatei, wie alles im Code oben getan wird, also weiß ich nicht, wie man Verfolgung einleitet, sonst hätte ich das auch eingeschlossen.

+0

Ich habe diesen Code auf meinem Computer ausgeführt. Während für die Methoden IntTest und StringTest kein Fehler zurückgegeben wird, gibt es auch keine Daten. Etwas anderes könnte falsch sein. –

Antwort

2

Die zurückgegebene Eigenschaft OtherTest muss ein konkreter Typ sein und keine Schnittstelle, sonst wird die Serialisierung nicht funktionieren.

+0

Das war's! Vielen Dank. Das bedeutet, dass ich die Geschäftsobjekte in einer freigegebenen Assembly haben muss. Ich hatte gehofft, dass ich nur die Schnittstelle duplizieren könnte, aber ich nehme an, das wird reichen müssen. Nochmals vielen Dank für Ihre Hilfe. – Farawin

0

Dies ist normalerweise ein Serialisierungsfehler. Suchen Sie nach dem [KnownType] -Attribut. Der einfachste Weg, dies zu testen, besteht darin, den DataContractSerializer direkt aufzurufen. Sie können die Methoden WriteObject und ReadObject verwenden, um die wahren Serialisierungsfehler zu erhalten. Sie können den Stream (in der Regel FileStream) auch überprüfen, um sicherzustellen, dass Sie serialisiert korrekt eingeben.

Verwandte Themen