Наличие проблемы, заставляющей мой POST JQuery быть принятым Сервисом WCF. Вот POST из JavaScript:
function jqueryPost() {
var url = "/LoggingTest";
$.post(url, { message: "test message" });
}
Это - то, как я принимаю должность через Интерфейс:
[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 Плохих Запросов. Не уверенный, как заставить запрос POST работать.
(Прибавляемый 7/1)
@James, вот вывод от веб-инспектора:
http://localhost:4252/LoggingTest информация о HTTP
Запрос Method:POST
Состояние Code:400 плохо запрашивает
Заголовки запроса
Accept:/
Cache-Control:max-age=0
Content-Type:application/x-www-form-urlencoded
Origin:http://localhost:4252
Referer:http://localhost:4252/
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; C-) AppleWebKit/532.4 (KHTML, как Геккон) спокойный/4.6.2 Safari/532.4
X-Requested-With:XMLHttpRequest
Данные формы
сообщение message:test
Заголовки ответа
Содержание-Length:1165
Content-Type:text/html
Date:Thu, 01 июля 2010 18:56:15 GMT
Server:Microsoft-HTTPAPI/1.0
Итак, я только что сделал это, Интерфейс:
[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);
}
Попробуйте добавить следующую строку в контракт на обслуживание, также я думаю, вам следует использовать WrappedRequest, вставленный из Bare
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
, посмотрите этот пост для получения дополнительных украшений
Это может быть только одна часть головоломки, чтобы заставить его работать на вас, но на какое-то время меня это зацепило:
Возможно, вам придется дважды проверить свой синтаксис JSON, я думаю, что это должны заключаться в строки в двойных кавычках и вокруг переменной, и вокруг имени переменной.
например.
function jqueryPost() {
var url = "/LoggingTest";
$.post(url, { message: "test message" });
}
должно быть:
function jqueryPost() {
var url = "/LoggingTest";
$.post(url, { "message": "test message" });
}
n.b. двойные кавычки "сообщение"
РЕДАКТИРОВАТЬ: Спасибо за отзыв ниже, вот несколько ссылок, которые могут оказаться полезными для форматирования JSON: