WCF + REST: Wo ist das anfordern von Daten?
Ich bin derzeit an der Entwicklung einer WCF-Rest-Dienst. Innerhalb der Validierung der POST-Daten, die ich bin werfen Ausnahmen, wenn der request-XML nicht konform zu unseren business-Regeln.
Das Ziel ist, senden Sie eine e-mail an den entsprechenden Mitarbeiter, wenn eine Anfrage kommt, die als ungültig betrachtet. Aber, zusammen mit den eingehenden request-Header, Methode und URI, ich möchte auch gerne das XML gepostet wurde.
Habe ich nicht in der Lage gewesen, einen Weg zu finden, um auf diese Daten zuzugreifen. Ist WCF tatsächlich zerstören die request-body/Daten, bevor ich eine chance haben, auf ihn zugreifen oder bin ich etwas fehlt?
Ihre Hilfe ist sehr geschätzt als ich bin verwirrt, warum habe ich keinen Zugriff auf die Daten anfordern.
InformationsquelleAutor RossG | 2009-12-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese leider nicht unterstützt - wir hatten ein ähnliches Bedürfnis, und zwar durch den Aufruf der internen Mitglieder mit Reflexion. Wir verwenden es in einem error-handler (so können wir einen dump der raw-Anforderung), aber es funktioniert OK. Ich würde nicht empfehlen es für ein system, das Sie nicht besitzen und betreiben, obwohl (zB nicht Schiff diesen code an einen Kunden), denn es kann sich jederzeit ändern mit einem service-pack oder was auch immer.
Vereinbart - der Vorteil ist, dass wir nicht haben, um zu schmuggeln, eine zweite Kopie von der transport-Ebene mit einer Meldung Inspektor auf jede Anfrage. Auf diese Weise können wir bei der original-Puffer direkt aus der service-code, und nur, wenn es ein problem gibt. Daher meine ursprüngliche Achtung. 🙂 Ich wünschte, Sie würden nur setzen Sie Sie aus der WebOperationContext, aber genommen haben Sie es abgesehen, ich sehen, warum Sie nicht (vor allem, wenn man bedenkt, gestreamt Anforderungen von beliebiger Größe).
Vielen Dank für die Beantwortung. Ich verstehe jetzt, warum Sie diesen Ansatz. Es ist interessant, dass, um zu verstehen, warum die WCF so wie es ist funktioniert, die Sie haben zu Graben, in die Umsetzung. Es Art von Niederlagen der Zweck, zu versuchen, zu abstrahieren von der Komplexität!
Nitzmahone, vielen Dank für die Bereitstellung dieses Beispiels. Zugriff auf den Request-body ist etwas, was ich bin nur zu wollen, zu tun ist, wenn im Umgang mit Fehlern. Ich Schätze die Antwort!!!
Damit einverstanden, dass Sie brauchen, um hinzuzufügen eine .GetBodyAsString () - Methode oder so etwas. Alles was ich brauchte war die rohen JSON-Daten und alles, was ich bekommen konnte, war eine XML-Repräsentation des JSON - JSON-Bibliothek, die ich verwenden muss die rohen JSON, nicht das, was Sie für die Daten Aussehen sollte!
InformationsquelleAutor nitzmahone
So, wenn Sie deklarieren, wird Ihr Vertrag so etwas wie:
(Sie können mit XML statt)
Die streamOfData sollte den body eines HTTP-POST. Sie Deserialisieren können Sie es mit etwas wie:
Ist es so, dass für uns zumindest. Sie möchten möglicherweise verwenden Sie einen anderen Ansatz, um den string in ein XMLDocument oder so etwas. Dies funktioniert für unsere JSON-Beiträge. Vielleicht nicht die eleganteste Lösung, aber es funktioniert.
Ich hoffe, das hilft.
Glenn
InformationsquelleAutor Ruprict
Versuchen, diese,
InformationsquelleAutor sajith
Hier ist, wie Sie es tun, ohne Reflexion:
Wenn der Leser ist ein
HttpStreamXmlDictionaryReader
(wie in meinem Fall), die Klasse die Implementierung der MethodeReadContentAsBase64(byte[] buffer, int index, int count)
einfach übergibt diese Parameter an dieStream.Rea
d-Methode.Sobald ich die
byte[]
ich umwandeln der bytes in eine Zeichenfolge im ASCII-Codierung. Für eine angemessene Umsetzung, Sie könnten den content-type & Kodierung aus den Kopfzeilen der Nachricht zu tun, die per HTTP-spec.Hier ist, wie Sie kümmern: stackoverflow.com/questions/2184806/...
InformationsquelleAutor George Tsiokos
Könnte man die Festnahme des
HttpApplication.Request.InputStrea
m in einem benutzerdefinierten HttpModule aufrufen der WCF-Dienst, Lesen Sie den Bach und wieder seine position 0 in der benutzerdefinierten HttpModule aufrufen der Ereignis-handler. Speichern Sie es dann in der Sitzung und greifen Sie weiter in die eigentlicheOperationContract
.Beispiel:
InformationsquelleAutor Yatin