Jak mieć WCF DataContract z członkiem dynamicznym json
w projekcie, nad którym pracuję, mamy wymóg posiadania DataContract, który może zawierać niezdefiniowany JSON.
DataMember to jakiś JSON, który ma sens tylko dla klienta. Chcemy pozwolić klientowi wysłać nam json, o którym nie wiemy.
Przykład:
public class Contract
{
[DataMember]
public int clientId;
[DataMember]
public string json;
}
Oczywiście posiadanie takiej umowy wymagałoby od klienta ucieczki od jsona w ten sposób:
{
"clientId":1,
"json": "{\"test\":\"json\"}"
}
Oczywiście to nie jest to, czego potrzebujemy. Json, który klient powinien nam wysłać, powinien wyglądać następująco:
{
"clientId":1,
"json": {"test":"json"}
}
Możliwe rozwiązania, które zbadaliśmy:
użyj Stream jako parametrów umowy dla treści żądania. Działa, ale umieszcza pracę po naszej stronie, zamiast używać frameworka.Definiowanie „json” jako obiektu DynamicObject. Nie działa. Nie był w stanie poprawnie pobrać nieruchomości.Korzystając z biblioteki Newtonsoft, zmień domyślny serializator umów w punkcie końcowym WCF, aby serializować wszystkie dane wejściowe do obiektu JObject. Zajmujemy się również serializacją na żądanie, co powoduje problemy w naszej aplikacji. Wolelibyśmy unikać tego.Czy ktoś ma możliwe rozwiązanie tego problemu?
EDYTOWAĆ
Usługa oferuje zasoby spoczynkowe. Definiuje pojedynczy punkt końcowy z webHttpBinding. Operacja jest zdefiniowana w ten sposób (uproszczona dla uproszczenia):
[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);
Ponadto usługa jest ozdobiona następującym atrybutem:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Dziękuję Ci. JF