Ersetzen des Altsystems und Erstellen eines neuen Servercodes mit Servicestack + Benutzerdefinierte Serialisierung

StackOverflow https://stackoverflow.com//questions/9683707

  •  13-12-2019
  •  | 
  •  

Frage

Wir haben einen älteren Servercode, den wir mit dem Servicestack neu aufgeben und entwickeln möchten.Bestehende Kunden werden nicht in .NET geschrieben.Wir planen nicht, .NET auf der Clientseite überhaupt zu verwenden.

Daten zwischen Client und Server werden mit XML und JSON ausgetauscht. Im Moment wird JSON nur als Rückgabeformat für die Antwort verwendet (nur für einige der verfügbaren Dienste).Das XML-Format wurde definiert, wenn die erste Version der Serverlösung vor ein paar Jahren erstellt wurde.Wir wollen es nicht ändern.

Wie verwenden wir Servicestack, um neue erholsame Webservices aufzubauen, die Daten in einem in der Vergangenheit entworfenen Format serialisieren und deserialisieren werden (bitte beachten Sie, dass Clients nicht in C # /.Wir müssen sowohl Kontakte: Serialisierung & Deserialisierung.Ist das möglich, DTOs zu verwenden und die Kontrolle zu verwenden, wie werden diese Objekte serialisiert / nacherialisiert?

War es hilfreich?

Lösung

Hinzufügen von benutzerdefinierten Logik über Anforderungs- / Antwortfilter

siehe Anfrage- und Antwortfilter , um zu sehen, wie Sie hinzufügen Benutzerdefinierte Logik vor und nachdem Ihr Service aufgerufen wird. Es ist am besten, diese Filter über den anfordern / response filterattribute hinzuzufügen, da Sie < stark> markieren nur die Dienste, die diese Filter anwendbar sind.

Das Problem mit dem Anforderungsfilter erfolgt nach der Deserialisierung in die Anforderung DTO, die zu spät ist, um eine benutzerdefinierte De-Serialisierungslogik hinzuzufügen. Um dies zu erreichen, können Sie in Ihrem Apphost ein benutzerdefiniertes Anforderungsbinder registrieren mit:

generasacodicetagpre.

Sie können Zugriff auf das IHTTPREQUEST-Objekt aufrufen und können Sie selbst die benutzerdefinierte Deserialisierungslogik hinzufügen. Die andere Option ist es, den Servicestack zu sagen, dass er nicht versucht, die Anforderung selbst zu ergeben, und injizieren Sie stattdessen den HTTPREQUEST-Eingabestrom, sodass Sie die Anfrage selbst erkennt:

generasacodicetagpre.

Beide Beispiele werden auf dem Servicestacks serialization und de-serialization Wiki-Seite erklärt .

Registrieren Sie Ihren eigenen benutzerdefinierten Medientyp

Eine andere Option, um stark eingegebene DTOs zurückzusetzen, aber die Ausgabe für bestimmte Anforderungen ändern kann, kann durch Hinzufügen eines neuen benutzerdefinierten Medientyps erfolgen, wie er in der Northwind VCard Custom Medientyp Beispiel , zB:

generasacodicetagpre.

Dies ist eine gute Option, wenn Sie die benutzerdefinierten XML-Antworten unter einem anderen Inhaltstyp montieren können, z. ANWENDUNG / V-XML In Konflikt also nicht mit dem vorhandenen XML-Format / Endpunkt. Die Verwendung des ContentType über Ihrem HTTP-Client kann diese benutzerdefinierte Implementierung mit ? Format= v-xml oder mithilfe des HTTP-Headers: akzeptieren: Application / V-XML . .

Wenn Sie den eingebauten XML-Contentype überschreiben möchten, können Sie jedoch weiterhin empfehlen, aber ich empfehle, auf die ursprüngliche XMLSerializer-Implementierung für die Methoden SerialiseReam und Deserializestream zurückzufallen, wenn es nicht eines der älteren Formate ist, die Sie unterstützen müssen.

BY-PASS Servicestack und führen Sie mit Ihrem eigenen benutzerdefinierten IHTTPHANDLER

aus

Eine andere Option ist der BY-PASS-Servicestack vollständig und verarbeiten Sie stattdessen die Anforderung in Ihrem eigenen iHTTPREQUEST-Handler, indem Sie ihn in der Service-Konfiguration in Ihrem Apphost registrieren:

generasacodicetagpre.

Rückkehr nicht-null (d. H. Jeder Handler) By-Passes Servicestack.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top