WCF, размещение данных в формате JSON - PullRequest
10 голосов
/ 14 июля 2009

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

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

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

[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"
});

Я отправляю данные с помощью jquery, используя $ .ajax, чтобы я мог вручную установить тип контента на «application / json», и когда он отправляется, почтовое тело выглядит как

custom=<uri encoded version of myClass>

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

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «Там была ошибка проверки начального элемента объекта типа MyAssembly.CustomClass. Обнаружено неожиданное символ «с». Смотрите журналы сервера для более подробной информации. Трассировка стека исключений: в 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 (Сообщение сообщение, параметры объекта []) в 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 (логическое значение isOperationContextSet)

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

Ответы [ 3 ]

4 голосов
/ 05 декабря 2011

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

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

3 голосов
/ 28 октября 2010

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

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

data:'{id: 1 }',

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

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

сработало

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

0 голосов
/ 26 ноября 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...