Не удается опубликовать в службе WCF Rest со строго типизированными аргументами

#wcf #rest

#wcf #rest

Вопрос:

У меня есть стандартное приложение WCF Rest (Web.config по умолчанию, веб-маршрутизация). Я не могу заставить платформу WCF автоматически десериализовать поток запросов в типизированные объекты. У меня есть служба с параметром метода в форме…

 [WebInvoke(Method = "POST", 
            UriTemplate = "", 
            BodyStyle = WebMessageBodyStyle.WrappedRequest, 
            ResponseFormat = WebMessageFormat.Json)]
MethodA(FirstParam first, SecondParam second)
  

Если я инициирую запрос от fiddler или jQuery, используя $.ajax, я получаю ошибку 400 Bad Request. Я провел множество поисков и обнаружил, что изменение метода sig для использования System.IO.Stream позволяет выполнять метод, однако это также увеличивает накладные расходы на десериализацию объектов.

Исходное тело запроса выглядит следующим образом

 {
    "first":"{"p1":"p1 value","p2":"p2 value","p3":100"p4":null}",
    "second":"{"p1":"p1 value"}"
}
  

Да, приложение даже не врывается в саму службу, если у метода нет потока или аргументов. В этой службе есть только 1 метод post, другой — метод GET, который работает корректно.

Я использовал http://www.codeproject.com/KB/ajax/jQueryWCFRest.aspx в качестве эталонной реализации, но не удалось заставить ее работать в этом решении.

Есть ли что-то, чего мне здесь не хватает, что, надеюсь, сможет увидеть кто-то другой?

Leon

Ответ №1:

Блин… проблема оказалась в том, как запрос сериализовал значения!

 {
    "first":"{"p1":"p1 value","p2":"p2 value","p3":100"p4":null}",
    "second":"{"p1":"p1 value"}"
}
  

Должно было быть без экранированных кавычек….

 {
    "first":"{"p1":"p1 value","p2":"p2 value","p3":100"p4":null}",
    "second":"{"p1":"p1 value"}"
}
  

Причина, по которой это происходило, заключалась в том, что JSON.stringify вызывался не только для обернутых параметров запроса, но и для каждого параметра.