Почему я должен возвращать коды ошибок, используя вызовы Javascript, в мой основной веб-сервис? - PullRequest
0 голосов
/ 20 мая 2019

Я размещаю веб-приложение ASP.NET в IIS и добавил файл TestWebService.asmx для поддержки некоторых вызовов API. Этот веб-сервис был основан на веб-сервисе, который работает с использованием SOAP в течение нескольких лет. У меня проблемы с вызовом этого нового метода тестирования веб-приложения из Javascript, однако. В конечном итоге я хочу поддержать вызов веб-метода с использованием форматов JSON и XML.

SOAP-интерфейсы к моим веб-службам успешно вызывают веб-метод и успешно возвращаются.

Я создал тестовый веб-метод в TestWebService, чтобы получить самый простой сценарий для меня. Кажется, мне не хватает чего-то фундаментального. В конечном итоге я хочу вернуть объекты JSON из моих более сложных веб-методов.

Что, кажется, работает.

  1. Я могу вызвать Test, отформатировав URL с параметрами в URL.
  2. Мой веб-метод не содержит ошибок.
  3. Я могу выполнить внутреннюю обработку и даже отформатировать возвращаемую строку JSON более сложными методами.

Что не работает.

  1. Мои вызовы 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, приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...