#web-services
#веб-службы
Вопрос:
Я вызываю веб-службу .NET из файла jQuery, который не является частью проекта. Всякий раз, когда я вызываю службу, она говорит OPTIONS /HOCWebService.asmx/HelloWorld и ничего не возвращает. Что происходит? В web.config я указал, что веб-службе разрешены HttpGet и HttpPost.
ОБНОВЛЕНИЕ 1:
$.ajax(
{
type: "POST",
url: "http://127.0.0.1:8080/HOCWebService.asmx/HelloWorld",
data: "{}",
dataType: "json",
contentType: "application/json",
success: function (response) {
alert(response.d);
var categories = $.evalJSON(response.d);
for (i = 0; i < categories.length; i ) {
var span = $(document.createElement("span"));
$(span).addClass("ui-li-count");
$(span).html(categories[i].Count);
var li = $(document.createElement("li"));
var anchor = $(document.createElement("a"));
$(anchor).attr("href", "/Home/detail/" categories[i].Id);
$(anchor).html(categories[i].Title);
$(li).append(anchor);
$(li).append(span);
// $("#categoriesListView").append('<li><a href="/Home/detail/' categories[i].Id '">' categories[i].Title '</a></li>');
$("#categoriesListView").append(li);
// $(span).text(categories[i].Count);
}
$("#categoriesListView").listview('refresh');
}
}
);
Комментарии:
1. можете ли вы добавить код для вызова $.ajax()?
2. @StevendeSalas Код был добавлен!
Ответ №1:
Реализация ASMX-файлов по умолчанию в .NET framework означает, что вы имеете дело с веб-службами SOAP и, следовательно, будете отправлять и получать XML, завернутый в конверт SOAP (а не JSON).
Попробуйте:
$.ajax({
// 1. Loose the 'HelloWorld' from the URL
url: "http://127.0.0.1:8080/HOCWebService.asmx",
type: 'POST',
async: false,
dataType: 'xml',
// 2. But add it as a HTTP Header called 'SOAPAction'
headers: {
SOAPAction: "http://www.tempuri.org/HelloWorld"
},
contentType: 'text/xml; charset="utf-8"',
// 3. The data sent to the server must be a SOAP XML Envelope
data: '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'
'<soap:Body>'
'<HelloWorld xmlns="http://www.tempuri.org/" />'
'</soap:Body>'
'</soap:Envelope>',
sucess: function(response) {
alert(response.responseText);
// Completion logic goes here
}
});
Пожалуйста, обратите внимание, что в рамках приведенной выше реализации вам нужен заголовок HTTP POST с именем ‘SOAPAction’, соответствующий вызываемому вами методу, иначе он не будет работать:
headers: {
SOAPAction: "http://www.tempuri.org/HelloWorld"
},
Означает, что запрос POST будет включать последнюю строку ниже:
POST /HOCWebService.asmx HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/soap xml; charset=utf-8
Content-Length: 453
SOAPAction: "http://www.tempuri.org/HelloWorld"
http://www.tempuri.org/
это пространство имен по умолчанию, используемое Корпорацией Майкрософт при создании новой службы ASMX, не стесняйтесь обновлять его до фактического пространства имен, которое вы используете в своей реализации.
ПРЕДЛОЖЕНИЕ:
Если вам нужно отправлять JSON назад и вперед из вашего приложения, могу ли я предложить вам использовать общий обработчик (файл ASHX), используя что-то похожее на этот подход.