So haben Sie einen WCF-Datenvertrag mit einem dynamischen json-Mitglied

Für das Projekt, an dem ich arbeite, ist ein DataContract erforderlich, der undefiniertes JSON enthalten kann.

Das DataMember ist ein JSON, das nur für den Client sinnvoll ist. Wir möchten, dass der Kunde uns json sendet, von dem wir nichts wissen.

Beispiel:

public class Contract
{
    [DataMember]
    public int clientId;
    [DataMember]
    public string json;
}

Wenn ein Vertrag wie dieser definiert wird, muss der Kunde den JSON-Code wie folgt verlassen:

{
    "clientId":1,
    "json": "{\"test\":\"json\"}"
}

Dies ist natürlich nicht das, was wir brauchen. Der json, den der Client uns senden soll, sollte folgendermaßen aussehen:

{
    "clientId":1,
    "json": {"test":"json"}
}

Mögliche Lösungen, die wir untersucht haben:

Verwenden Sie Stream als Vertragsparameter für den Anforderungshauptteil. Funktioniert, stellt aber die Arbeit auf unsere Seite, anstatt das Framework zu verwenden.Definieren von "json" als DynamicObject. Funktioniert nicht. Konnte die Eigenschaft nicht richtig geschrieben bekommen.Ändern Sie unter Verwendung der Newtonsoft-Bibliothek den Standardvertragsserialisierer im WCF-Endpunkt, um alle Eingaben in ein JObject zu serialisieren. Wir kümmern uns auch um die Serialisierung auf Anfrage, was zu Problemen in unserer Anwendung führt. Wir möchten diesen Weg lieber meiden.

Hat jemand eine mögliche Lösung für dieses Problem?

BEARBEITEN

Der Service bietet Restbestände. Es definiert einen einzelnen Endpunkt mit webHttpBinding. Die Operation ist wie folgt definiert (der Einfachheit halber abgespeckt):

[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);

Der Dienst ist außerdem mit folgenden Attributen versehen:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

Vielen Dank. JF

Antworten auf die Frage(5)

Ihre Antwort auf die Frage