400 неверный запрос HTTP-ответа с использованием WCF POST через JQuery - PullRequest
7 голосов
/ 30 июня 2010

Возникли проблемы с получением моего JQuery POST, который будет принят службой WCF. Вот ПОСТ из javascript:

function jqueryPost() {
    var url = "/LoggingTest";
    $.post(url, { message: "test message" });
}

Вот как я принимаю POST через интерфейс:

[OperationContract]
[WebInvoke(Method = "POST",
           UriTemplate = "/LoggingTest",
           BodyStyle = WebMessageBodyStyle.Bare)]
void LoggingTest(string message);

И реализация:

public void LoggingTest(string message)
{
    log.Debug(message, null);
}

Когда я вызываю функцию jqueryPost, я вижу в веб-инспекторе HTTP-ответ 400 Bad Request . Не уверен, как заставить работать запрос POST.

(добавлено 7/1)
@James, вот вывод веб-инспектора:

http://localhost:4252/LoggingTest Информация HTTP
Способ запроса: POST
Код статуса: 400 Неверный запрос
Заголовки запроса
Принимаем: /
Cache-Control: max-age = 0
Тип содержимого: application / x-www-form-urlencoded
Происхождение: http://localhost:4252
Реферер: http://localhost:4252/
Пользовательский агент: Mozilla / 5.0 (Windows; U; Windows NT 5.1; C -) X-Requested-With: XMLHttpRequest
Данные формы
сообщение: тестовое сообщение
Заголовки ответа
Длина контента: 1165
Тип контента: текст / html
Дата: четверг, 01 июля 2010 г. 18:56:15 GMT
Сервер: Microsoft-HTTPAPI / 1.0

Ответы [ 3 ]

2 голосов
/ 03 июля 2010

Итак, я только что закончил, интерфейс:

[OperationContract]
[WebInvoke(Method = "POST",
           UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}",
           BodyStyle = WebMessageBodyStyle.Bare)]
void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message);

Реализация:

public void LoggingTest(string logID, string logLevel, int errorCodeInt, Stream message)
    {
        switch (logLevel)
        {
            case "error":
                log.Error(errorCodeInt, message, null);
                break;
            case "warn":
                log.Warn(errorCodeInt, message, null);
                break;
            case "info":
                log.Info(errorCodeInt, message, null);
                break;
            case "debug":
                log.Debug(errorCodeInt, message, null);
                break;
        }
    }

И теперь это работает.Должно быть как-то связано с параметрами, передаваемыми в UriTemplate, потому что когда я изменил его, чтобы передать параметры следующим образом:

UriTemplate = "LoggingTest/{logID}/{logLevel}?errorCode={errorCodeInt}",

он начал принимать POST.

Редактировать 7 /7: Вот и последний JavaScript:

jqueryPost('LoggingTest/LogID/debug?errorCode=0', { message: 'this is a test message'} ;

function jqueryPost(url, message) {
    $.post(url, message);
}
1 голос
/ 03 июля 2010

Это может быть только одна часть головоломки, чтобы заставить ее работать на вас, но это меня некоторое время застало:

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

например,

function jqueryPost() {
    var url = "/LoggingTest";
    $.post(url, { message: "test message" });
}

должно быть:

function jqueryPost() {
    var url = "/LoggingTest";
    $.post(url, { "message": "test message" });
}

nb двойные кавычки "сообщение"


РЕДАКТИРОВАТЬ: Спасибо за отзывниже приведены несколько ссылок, которые могут оказаться полезными для форматирования JSON:

1 голос
/ 30 июня 2010

Попробуйте добавить следующую строку в сервисный контракт, также я думаю, что вы должны использовать WrappedRequest вместо Bare

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

. Загляните в этот пост , чтобы получить больше украшений

...