Я пытаюсь отправить сообщение в службу данных ADO.NET, но параметры, похоже, теряются по пути.
Получилось что-то вроде:
[WebInvoke(Method = "POST")]
public int MyMethod(int foo, string bar) {...}
и я делаю ajax-вызов, используя prototype.js как:
var args = {foo: 4, bar: "'test'"};
new Ajax.Requst(baseurl + 'MyMethod',
method: 'POST',
parameters: args,
onSuccess: jadda,
onFailure: jidda
}
Если я заменю «method: 'POST'» на «method: 'GET'» и «WebInvoke (Method =« POST »)» на «WebGet», все будет работать, но теперь (используя post) все, что я получаю, это:
Bad Request - Error in query syntax.
из службы.
Единственное исправление (которое я не хочу использовать) - это отправлять все параметры в URL-адресе, даже когда я отправляю сообщение. Любые идеи приветствуются.





Если вы хотите использовать POST, вам необходимо указать параметры, которые будут заключены в запрос в атрибуте WebInvoke, если только параметры не содержатся в объекте (например, в контракте сообщения). Это имеет смысл, поскольку невозможно сериализовать параметры без упаковки в json или xml.
Развернутый, который на самом деле не является XML, поскольку отсутствует корневой элемент
<foo>1</foo>
<bar>abc</bar>
Обернутый, действительный XML
<Request>
<foo>1</foo>
<bar>abc</bar>
</Request>
Этот пример также применим к JSON
Вы говорите, что я должен обернуть параметры в javascript, например
var args = {Request: {foo: 3, bar: "'test'"}}
или я что-то упускаю?
Я пытался добавить:
ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped
в атрибут WebInvoke, но безрезультатно. Я пытался установить «Content-Type» (в js POST ajax-call) на «application / x-www-form-urlencoding» и «application / json; charset = utf-8», но безрезультатно.
Веб-службы WCF и ASMX имеют тенденцию быть немного разборчивыми в отношении тела запроса, когда вы указываете args, запрос обычно кодируется как сообщение формы, то есть foo = 4 & bar = test вместо этого вам нужно указать литерал javascript: -
new Ajax.Request(baseurl + 'MyMethod', {
method: 'POST',
postBody: '{"foo":4, "bar":"test"}',
encoding: "UTF-8",
contentType: "application/json;",
onSuccess: function(result) {
alert(result.responseJSON.d);
},
onFailure: function() {
alert("Error");
}
});