Я размещаю веб-приложение ASP.NET в IIS и добавил файл TestWebService.asmx для поддержки некоторых вызовов API. Этот веб-сервис был основан на веб-сервисе, который работает с использованием SOAP в течение нескольких лет. У меня проблемы с вызовом этого нового метода тестирования веб-приложения из Javascript, однако. В конечном итоге я хочу поддержать вызов веб-метода с использованием форматов JSON и XML.
SOAP-интерфейсы к моим веб-службам успешно вызывают веб-метод и успешно возвращаются.
Я создал тестовый веб-метод в TestWebService, чтобы получить самый простой сценарий для меня. Кажется, мне не хватает чего-то фундаментального. В конечном итоге я хочу вернуть объекты JSON из моих более сложных веб-методов.
Что, кажется, работает.
- Я могу вызвать Test, отформатировав URL с параметрами в URL.
- Мой веб-метод не содержит ошибок.
- Я могу выполнить внутреннюю обработку и даже отформатировать возвращаемую строку JSON более сложными методами.
Что не работает.
- Мои вызовы Javascript никогда не сообщают об успешном ответе на мои веб-методы с использованием класса XMLHttpRequest или метода .AJAX.
Мой веб-сервис TestWebService.cs - ScriptService установлен и ScriptMethod установлен для метода Test
/// <summary>
/// Summary description for TestWebService
/// </summary>
[WebService(Namespace = "http://Test.org/TestWebService")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// Allow this Web Service to be called from script, using ASP.NET AJAX
[System.Web.Script.Services.ScriptService]
public class TestWebService : WebService
{
[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true)]
public void Test(string string1)
{
HttpContext.Current.Response.StatusCode = 200;
HttpContext.Current.Response.Write("{'success':'true'}");
}
}
В моем TestWebPage.html используется XMLHttpRequest.
function Test()
{
alert("In Test 1");
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
alert("In callback 1, readState=" + this.readState + ", status=" + this.status + ", response=" + xhttp.responseText);
if (this.readState == 4 && this.status == 200) {
alert("Test success");
}
};
var address = "http://localhost/TestWebService/TestWebService.asmx/Test?string1=teststring";
xhttp.open("GET", address, true);
xhttp.send();
}
AJAX версия теста ()
function Test()
{
var test = "teststring";
$.ajax({
type: "POST",
url: "http://localhost/TestWebService/TestWebService.asmx/Test",
data: {string1: test},
dataType: "html",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
}).done(function(data) {
alert("Test success");
}).fail(function (jgXHR, textStatus, errorThrown)
{
alert("Test failed - " + jgXHR.responseText + " ,status =" + textStatus + " ,err= " + errorThrown);
});
}
В конечном счете, я хочу получить предупреждение "Test success" из моих обратных вызовов чтения. В веб-сервисе я вижу, что код состояния установлен на 200. При вызове XMLHttpRequest я вижу только значения кода ответа 0. При вызове AJAX я вижу текстовое значение неопределенного статуса. (Не полезно)
Я использовал тип urlencoded для contentType, так как мне удалось получить его для вызова веб-метода.
Мне не удалось получить ответ от моего веб-сервиса при использовании AJAX со следующими настройками.
dataType: "json",
contentType: "application/json; charset=utf-8"
Похоже, мне нужно изменить настройку на моем веб-сервере для получения запросов JSON.
Однако, когда я устанавливаю dataType равным jsonp, я получаю запрос в своем веб-сервисе. Проблема для JSONP заключается в том, что мой веб-сервис не вызывает метод обратного вызова, даже если он указан jsonCallack. Мое расследование показало, что мне может понадобиться добавить JsonPFormatter, который будет вызывать обратный вызов. Я попытался добавить форматер в Application_Start для моего веб-сервиса, но это не помогло.
Любой вклад, который приведет меня к успешному результату из моих вызовов Javascript, приветствуется.