Плохой запрос: служба WCF REST со стартовым комплектом

Я пытаюсь создать службу WCF на основе REST и json, которая принимает в качестве входных данных сложный тип. На клиенте я пытаюсь использовать эту службу с помощью HttpClient, который входит в состав WCF REST Starter Kit.

Ниже мой сервисный код:

[WebInvoke(Method = "POST", UriTemplate = "/SendData", BodyStyle = WebMessageBodyStyle.Wrapped)]
public void SendData(List<EditorData> input)
{
//Do something
}

Я использовал другие варианты, которые можно было найти в перечислении WebMessageBodyStyle, но безрезультатно.

Вот мой контракт данных сложного типа, который я также использую в своем клиенте:

public class EditorData
{
    public string key { get; set; }
    public long quesno { get; set; }
    public string quescontent { get; set; }
}

Код клиента:

List<EditorData> listEditor = new List<EditorData> { new EditorData { key = "key1", quescontent = "qcontent1", quesno = 1},new EditorData { key = "key2", quescontent = "qcontent2", quesno = 2}};
string jsonEditorList = listEditor.ToJSON();
HttpClient client = new HttpClient("http://localhost/RestWcfService/RestService.svc/");
client.DefaultHeaders.Accept.Add("application/json");
HttpResponseMessage response = null;
response = client.Post("SendData", HttpContent.Create(jsonEditorList));
response.EnsureStatusIsSuccessful();

Чтобы преобразовать свой список настраиваемых объектов в строку json, я использую найденный мной метод расширения здесь

Когда я запускаю это приложение, я получаю следующую ошибку:

BadRequest (400) is not one of the following: OK (200), Created (201), Accepted (202), NonAuthoritativeInformation (203), NoContent (204), ResetContent (205), PartialContent (206)

Есть предположения?

РЕДАКТИРОВАТЬ:

Вот скриншот скрипача:

введите описание изображения здесь

ОБНОВЛЕНИЕ:

Как предложил Джейсон Фрейтас, я проверил ответ в скрипте. Вот что сказано:

The server encountered an error processing the request. See server logs for more details.

Итак, я вошел в журналы IIS, и вот ошибка, записанная в IIS:

2012-02-15 13:20:08 fe80::ecdd:d2dd:7f70:bef6%11 POST /RestWcfService/RestService.svc/SendData - 80 - fe80::ecdd:d2dd:7f70:bef6%11 - 400 0 0 0

ОБНОВЛЕНИЕ 2

По предложению Раджеша я включил трассировку для своей службы wcf. Ниже приведено исключение, созданное сервером:

The incoming message has an unexpected message format 'Raw'. The expected message formats for the operation are 'Xml', 'Json'. This can be because a WebContentTypeMapper has not been configured on the binding. See the documentation of WebContentTypeMapper for more details.

Я до сих пор не понимаю, как он получает формат Raw, когда я указал тип содержимого как json.


person Vinod    schedule 15.02.2012    source источник
comment
Что говорилось в окне ответа в Fiddler? Попробуйте отключить customErrors, чтобы увидеть, если вы получите более подробное сообщение об ошибке.   -  person Jason Freitas    schedule 15.02.2012
comment
Я обновил исходное сообщение ответом скрипача. Спасибо!   -  person Vinod    schedule 15.02.2012
comment
Пожалуйста, посмотрите мое обновление ниже в моем ответе   -  person Rajesh    schedule 15.02.2012


Ответы (2)


Сначала попробуйте включить трассировку в своей службе WCF, чтобы увидеть точную причину ошибка 400 неверного запроса.

Похоже, что вводимые данные имеют неправильный формат. Вы определили список EditorData в качестве параметра метода и разместили несколько пар ключ-значение (со ссылкой на снимок экрана вашего скрипта). Убедитесь, что строка json в скрипте при десериализации преобразуется в список объектов EditorData.

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

ОБНОВИТЬ:

Не забудьте добавить Content-Type в заголовок, как показано ниже:

client.DefaultHeaders.ContentType = "application/json";
person Rajesh    schedule 15.02.2012
comment
Спасибо за ваши комментарии Раджеш, я включил трассировку для моей службы и обновил исходный пост своими выводами (UPDATE2). - person Vinod; 15.02.2012
comment
Пожалуйста, просмотрите мое обновление и как только вы добавите тип контента, который должен устранить вашу ошибку. - person Rajesh; 15.02.2012

[WebInvoke] по умолчанию используется сериализация XML. Вам нужно сообщить ему, что вы отправляете данные в формате JSON. Задайте RequestFormat в атрибуте WebInvoke следующим образом

RequestFormat = WebMessageFormat.Json

person Richard Blewett    schedule 15.02.2012
comment
Это не работает и, похоже, не влияет на службу вообще - очень жаль, поскольку я думал, что он будет делать то же самое - лучший вопрос, почему черт возьми wcf не может определить тело запроса json vs XML - кажется ОЧЕНЬ ПРОСТО и работает как это в WebApi: - - person schmoopy; 13.06.2013