Вызов ASMX WebMethod из jQuery - responseText является пустым xhr.status = "error" - PullRequest
0 голосов
/ 07 апреля 2011

Я полностью сбит с толку.

  1. jquery v1.5.2 Firefox 3.6.16 ASMX
  2. Элемент списка
  3. Веб-сервис, написанный на VS 2010, .Net Framework 3.5
  4. Размещено на веб-сервере разработки VS 2010 на локальном компьютере ИЛИ НА
  5. Главный веб-сервер под управлением IIS 7.5 на Windows Web Server 2008 R2

Локальный веб-сервер разработчика и основной рабочий веб-сервер работают одинаково

  1. Веб-сервис работает хорошо при вызове из браузера.
  2. Я получаю список методов.
  3. Я могу нажать на название метода
  4. Я могу нажать кнопку Invoke, метод вызывается и результат возвращается

Когда моя страница jquery вызывает тот же веб-метод, функция ошибки запускается со следующими полями состояния

readyState: 0 responseText: "" статус: 0 statusText: «ошибка» ошибка: функция ()

Моя часть jQuery

        <script type="text/javascript">
              $(document).ready(function() {
                    $.ajax({
                        type: 'POST',
                        url: 'http://localhost:1272/ndtvservices.asmx/HelloWorld',
                        data: '{}',
                        contentType: 'application/json; charset=utf-8',
                        dataType: 'json',
                        success: function(msg) {
                                 alert("success " + msg) ;
                        },
                        error: function(xhr, status, error) {
                                 var err = eval("(" + xhr.responseText + ")");
                                 alert(err.Message) ;
                        }
                    });
               });
        </script>

Мой веб-метод

Импорт System.Web.Services

Импорт System.Web.Services.Protocols

Импортирует System.ComponentModel

Импорт System.Web.Script.Services

Импортирует System.Web.Script.Serialization

'Чтобы разрешить вызов этой веб-службы из сценария с использованием ASP.NET AJAX, раскомментируйте следующую строку. '_

_

_ _

Public Class Service1 Наследует System.Web.Services.WebService

'<ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)> _
<WebMethod()> _
Public Function HelloWorld() As String
    Dim js As New JavaScriptSerializer
    Dim s As String = "Hello World"
    Dim sReturn As String = js.Serialize(s)
    Return sReturn
End Function

Конечный класс

Моя веб-конфигурация в system.web содержит эти записи, как я где-то читал на SO

  <webServices>
    <protocols>
      <add name="HttpGet"></add>
      <add name="HttpPost"></add>
    </protocols>
  </webServices>

_

Я пытался с комментариями и комментариями, приведенными выше.

Насколько я понимаю, это не требуется для ajax-страницы не asp.net, вызывающей этот метод.

Что я делаю не так?

Спасибо большое

С наилучшими пожеланиями

Айер

1 Ответ

2 голосов
/ 07 апреля 2011

Вы не должны вручную JSON-сериализовать ответ в вашем сервисном методе.ASP.NET уже делает это для вас автоматически.Все, что вам нужно:

<WebMethod()> _
Public Function HelloWorld() As String
  Return "Hello World"
End Function

И убедитесь, что ваш сервис украшен атрибутом ScriptService (мой VB.NET довольно ржавый, так что это может быть немного не так):

<ScriptService()> _
Public Class ndtvservices Inherits WebSerivce

Кроме того, я бы не использовал полностью определенный URI в параметре url $ .ajax ().Это должно быть все, что вам нужно:

url: '/ndtvservices.asmx/HelloWorld'

Наконец, если вы используете ASP.NET 3.5 или новее, ASP.NET упаковывает ответ JSON в объект ".d" для защиты от конкретной проблемы безопасности, связанной с массивами JSON.Вы захотите "расставить точки" в этом объекте-обёртке в вашем обратном вызове успеха следующим образом:

success: function(msg) {
  alert("success " + msg.d) ;
}
...