2012-04-03 10 views
1

Ich versuche, REST-Dienst in meiner C# -Anwendung zu implementieren, um mit Android-Client zu kommunizieren. Ich habe Probleme mit C# -Teil.REST Service zurückkehrendes Objekt bricht ab

folgte ich diesen Artikel: http://msdn.microsoft.com/en-us/library/bb412178

Dies ist, wie ich meinen Dienst laufen:

WebServiceHost host = new WebServiceHost(typeof(RestService), new Uri("http://localhost:8000/")); 
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IRestService), new WebHttpBinding(), ""); 
host.Open(); 

Sehr wie in Artikel oben Ich habe IRestService verknüpft Schnittstelle und RestService mit Methoden EchoWithGet (string s) und EchoWithPost was ich nicht benutze und ich werde nicht mehr darüber reden. Ich möchte die UserClientInfo-Klasse zurückgeben, die die Ursache des Problems ist, das ich später beschreiben werde.

[ServiceContract] 
interface IRestService 
{ 
    [OperationContract] 
    [WebGet] 
    UserClientInfo EchoWithGet(string s); 
} 

Hier ist die Implementierung von EchoWithGet (...). Es verbindet sich mit einem anderen Dienst und ruft UserLog auf, der UserClientInfo zurückgeben soll.

UserClientInfo ist recht komplexes Objekt. Ich bin nicht sicher, ob ich es durch den Service zurückgeben kann. Es ist eine Struktur, die andere Strukturen enthält, die andere Strukturen enthalten.

[Serializable] 
public struct UserClientInfo 
{ 
    public ulong ClientId; 
    public DatabaseManager DBManager; 
    public string DisplayedName; 
    public ChISDispositions Dispositions; 
    public RegistrationInfo RegistrationInfo; 
    public uint Right1; 
    public uint Right2; 
    public uint Right3; 
    public uint Right4; 
    public string SessionId; 
    public string UserId; 
} 

Als ich meinen Dienst laufen und mein Browser http zeigen: // localhost: 8000/EchoWithGet s = Teststring I Anschluss für unterbrochene Fehler. Firebug zeigt den Status Abgebrochen auf der Registerkarte Netzwerk an. Service stürzt irgendwie ab. Ich kann es debuggen und sehen, dass UserLog() uci Objekt gut zurückgibt und Dienst es zurückgibt, aber irgendwo zwischen Browser und Dienst schlägt es fehl.

Ich habe versucht, komplett neues Objekt zurückgeben:

UserClientInfo uci = new UserClientInfo(); 

, das funktioniert und gibt xml mit einfachem Objekt.


Gibt es etwas, was ich falsch mache?

Gibt es Einschränkungen bei den Diensten, die ich kennen sollte?

Gibt es ein Protokoll, wo ich sehen könnte, was falsch ist?

Danke für jede Antwort.

+0

Überprüfen Sie, ob in Ihrer UserClientInfo-Datenstruktur keine zyklischen Abhängigkeiten vorhanden sind. Wenn Sie es tun, wird es während der Serialisierung ersticken. Das kann der Grund sein, warum eine neue UserClientInfo durchgeht, aber eine, die mit tatsächlichen Daten gefüllt ist. –

+1

Wahrscheinlich ist Ihr Problem mit einem dieser drei Typen, DatabaseManager, ChISDispositions, RegistrationInfo. Ist DatabaseManager eine Klasse? Wenn ja, hast du versucht, es auf null zu setzen? – JamieSee

+0

Wie Sie gesagt haben - Problem ist in ChiSDispositions. Wenn ich es auf Null setze, bekomme ich die Ausgabe. Es gibt einige Methoden und Konstanten in ChiSDispositions. Ich fand auch Hinweise auf Enum-Typen. Könnte das die Ursache sein? Aber alles, was ich dort gefunden habe, ist serialisierbar. –

Antwort

0

Das Problem bestand in komplexen Teilen dieses komplexen Objekts. Lösung war, es in DTO umzuwandeln.

0

Gibt es ein Protokoll, wo ich sehen könnte, was falsch ist?

Sie können WCF logging in Ihrer Datei web.config hinzufügen. Sie können dann S ervice Trace Viewer Tool zum Lesen/Überwachen verwenden.

Verwandte Themen