Неправильный запрос: WCF REST Service со стартовым комплектом
Я пытаюсь создать службу WCF на основе REST & JSON, которая принимает сложный тип в качестве входных данных. На клиенте я пытаюсь использовать этот сервис, используя HttpClient, который входит в состав начального комплекта WCF REST.
Ниже мой сервисный код:
[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.
2 ответа
Сначала попробуйте включить трассировку в своей службе WCF, чтобы увидеть точную причину ошибки 400 неверных запросов.
Похоже, что размещаемая информация имеет неверный формат. Вы определили список EditorData в качестве параметра метода и разместили несколько пар ключ-значение (ссылаясь на ваш скриншот fiddler). Убедитесь, что строка json в fiddler после десериализации преобразована в список объектов EditorData.
Также вы установили стиль тела, который будет обернут. Попробуйте удалить это и посмотреть, работает ли это. Обернутые запросы используются, когда у вас есть несколько параметров, тогда в этом случае вы оборачиваете все параметры внутри элемента имени метода и отправляете его по проводам.
ОБНОВИТЬ:
Обязательно добавьте Content-Type в заголовок, как показано ниже:
client.DefaultHeaders.ContentType = "application/json";
[WebInvoke]
по умолчанию используется XML-сериализация. Вы должны сообщить, что отправляете данные в формате JSON. Установите RequestFormat в атрибуте WebInvoke следующим образом
RequestFormat = WebMessageFormat.Json