WCF, POSTing JSonized data

У меня сложный тип:

[DataContract]
public class CustomClass
{
   [DataMember]
   public string Foo { get; set; }
   [DataMember]
   public int Bar { get; set; }
}

Затем у меня есть веб-сервис WCF RESTful, который имеет это в нем:

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/class/save")]
bool Save(CustomClass custom);

поэтому на стороне браузера я jsonized мой объект CustomClass, это выглядит так:

var myClass = "{ foo: \"hello\", bar: 2 }";
$.ajax({
    contentType: "application/json",
    data: { custom: myClass },
    dataType: "json",
    success: callback,
    type: "POST",
    url: "MyService.svc/class/save"
});

Я отправляю данные w/jquery с помощью $.ajax, поэтому я могу вручную установить тип содержимого на "application/json", и когда он отправляется, postbody выглядит как

custom=<uri encoded version of myClass>

Я получаю следующую ошибку:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: "Там  был элементом проверки ошибки объекта MyAssembly.CustomClass. Неожиданно  символ 'c'. '. Подробнее см. Журналы сервера. Трассировка стека исключений:  в System.Runtime.Serialization.XmlObjectSerializer.IsStartObjectHandleExceptions(XmlReaderDelegator reader)  в System.Runtime.Serialization.Json.DataContractJsonSerializer.IsStartObject(XmlDictionaryReader  читатель)  в System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(сообщение сообщения)  в System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(сообщение сообщения , Параметры объекта [])  в System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Сообщение  message, Object [])  в System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(сообщение сообщения , Параметры объекта [])  в System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(сообщение сообщения, объект [])  в System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc & rpc)  в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc & rpc)  в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc)  в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc)  в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & rpc)  в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc)  в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & rpc)  в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Я попытался обернуть мои данные json'ized... я попытался использовать $.post для отправки сообщения (но это не устанавливает тип содержимого для приложения /json, поэтому веб-сервис не понимает).. any идеи?

Ответ 1

Таким образом, проблема, с которой вы столкнулись, - это ошибка сериализации. WCF хочет увидеть имя свойства в JSON, завернутое в "

Итак, я просто столкнулся с той же ошибкой, где

data:'{id: 1 }',

не работает, но

 data:'{"id": 1 }',

работал

Я надеюсь, что это поможет кому-то еще

Ответ 2

Проблема, что вы правильно экранировали объект, но когда вы строите сложный объект Json в методе post jQuery, вы не обходите оболочку. Поэтому вам нужно либо сбежать из целого объекта JS, как это: "{\" custom\ ": \" {foo:\ "hello \", bar: 2}\ "}" (я на самом деле не пробовал это сам, но должен работать), или (возможно, лучшее решение) используйте JSON.stringify({custom: myClass})

WCF действительно чувствителен к объектам JSON, которые он получает для сериализации.