2009-10-23 6 views
5

Ich habe gearbeitet, um WCF-Dienste zu erstellen, die unabhängig von .Net-Clients funktionieren. Dank Google und StackOverflow war ich in der Lage, sowohl einfache XML- als auch JSON-Dienste ohne Soap-Wrapper und eine Reihe von ausgefallenen WCF-Inhalten zu erstellen, die ich einfach nicht brauche. Es war eine schmerzhafte Erfahrung, daher der Gegenstand dieser Frage. WCF ist ein fehlerhafter Buggy auf der Clientseite, wenn WebGet und WebInvoke beim automatischen Hinzufügen der Dienstreferenz verwendet werden.WCF-Client (Add Service Reference) hasst WebGet und WebInvoke ... wirklich, tut es

Um die Kommunikation zu überprüfen, habe ich lokal einen WCF-Client erstellt und alles durch Fiddler übergeben. Auf diese Weise, ob es funktioniert oder nicht, kann ich zumindest sehen, was der Client sendet. Und wenn es schließlich funktioniert, kann ich sehen, dass die Daten von beiden Enden gesendet werden, und dann diese Kommunikation in einem Nicht-.Net-Client duplizieren.

Mein aktuelles Problem ist, dass, wenn ich den Dienst ändern, um POST-Daten als json (enableWebScript-Verhalten) zu erwarten, der Client keine Ahnung hat, und es immer noch versucht, die Objekte als XML zu senden. Ich hatte eine Menge Probleme damit, dass die Konfiguration des Clients nicht automatisch richtig eingestellt wurde, wenn ich die Service Referenz nutze. Ich hoffe, dass es etwas Einfaches ist, das ich der app.config auf dem Client hinzufügen kann. Bei Verwendung von XML werden die Objekte, die ich im Service erstelle und verwende, automatisch vom Client xml serialisiert (was am bequemsten ist). Ist das in der aktuellen WCF-Version überhaupt möglich?

Es ist zu beachten, dass ich in der Lage war herauszufinden, was ich manuell tun muss und es in roher Form mit Fiddler (Request Builder) arbeiten, so dass ich meine Objekte im Code serialisieren und die Daten manuell senden kann via http post ... so mache ich es sowieso in meinen non.Net clients. Dies ist eher eine Frage, um die WCF-Aspekte besser zu verstehen, und warum mir auf der Client-Seite so viele Attribute fehlen, dass wenig oder gar keine Dokumentation verfügbar ist, um die Probleme anzugehen.

+0

Man .. Ich wünschte, ich hätte das früher gelesen. Wir haben im Grunde genau den gleichen Gedankenprozess durchlaufen. Ich habe erwartet, dass der REST-Client "nur funktioniert" wie der SOAP-Client. –

+0

Sind Sie an WCF gebunden oder haben Sie die Option für Server/Service-Nutzlasttechnologie? Seit ich dies vor zwei Jahren gepostet habe, habe ich mich gegen WCF gewehrt. Jeder Dienst, den ich manuell erstelle oder benutze, erstellt leichtgewichtige XML- und/oder JSON-Daten, und ich verwalte meine eigene Sicherheit und alles, was WCF für den Entwickler bequemer machen wollte. Ich denke, es ist ziemlich bezeichnend, dass es praktisch unmöglich ist, eine populäre öffentliche Web-API als WCF-Dienst zu finden. – Rich

+0

Nein, wir sind nicht an WCF gebunden, aber ich denke, wir könnten es für einen unserer Dienste versuchen. Das Erstellen der serverseitigen Komponenten mit WCF war schmerzhaft, bis wir alles verstanden haben. Obwohl ... es war schön, die Endpunkte nicht manuell erstellen zu müssen (SOAP/REST/JSON funktionierte).Jetzt weiß ich, dass wir SOAP verwenden werden, wenn wir einen .NET-Client verwenden und andere REST/JSON konsumieren lassen. –

Antwort

3

WCF-Service-Referenzen sind für RPC-Payloads, die selbstbeschreibend sind - dh SOAP, wsHttp usw. Ebenso sind stark typisierte WCF-Clients nur für die RPC-Payloads gedacht, da nur sie alle Typinformationen übertragen können Voraussetzung dafür, dass es richtig funktioniert.

Wenn Sie webget und webinvoke verwenden, erstellen Sie Nicht-RPC-Dienste (zum Schreiben von REST-Diensten), die ebenfalls nicht selbstbeschreibend sind und daher nicht ideal für die Dienstreferenzfunktionalität geeignet sind.

Sie können natürlich einen .Net-Client schreiben - aber Sie werden es mit WebClient/WebRequest einfacher finden, die XML/JSON-Anfragen/-Antworten manuell zu formatieren/zu lesen (oder DataContractSerializer und DataContractJsonSerializer zu verwenden) damit zu helfen).

1

SOAP ist selbstbeschreibend (über eine WSDL).

WebGet/WebInvoke stellt keine Metadaten bereit, die den Client zur Verwendung von JSON anstelle von XML auffordern würden.