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, которые он получает для сериализации.
Ответ 3
Посмотрите здесь свой ответ: Как разместить массив сложных объектов с помощью JSON, jQuery для ASP.NET MVC Controller?