Вызов .Веб-служба NET из jQuery

#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), используя что-то похожее на этот подход.