использование jQuery AJAX с веб-сервисами asp.net всегда приводит к ошибке: вместо успеха: - PullRequest
4 голосов
/ 05 декабря 2009

Issue

У меня есть страница aspx с кодом jQuery для отправки запроса ajax в файл веб-службы asmx (на том же веб-сайте). Ответ, который возвращается, не является согласованным, однако он последовательно запускает обратный вызов jQuery «ошибка», а не обратный вызов «success». Код состояния непостоянно варьируется между 200, 12030 и 12031. responseText сообщения обратного вызова непостоянно варьируется между [пустым] и фактическим XML, который возвращает веб-служба json. Я отладил код, и веб-сервис действительно выполняется без каких-либо исключений.

Код ASPX

// Код для краткости опущен

<script type="text/javascript">
jQuery(document).ready(function()
{
  jQuery.ajax({
  type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "CallDequeue.asmx/Dequeue",
    data: "{}",
    dataType: "json",
    success: function(Msg)
    {
      alert('success:' + Msg.responseText);
    },
    error: function(Msg)
    {
      alert('failed:' + Msg.status + ':' + Msg.responseText);
    }
  });
});
</script>

// Код для краткости опущен

Код веб-службы

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class CallDequeue : System.Web.Services.WebService
{
  [WebMethod]
  public string Dequeue()
  {
    return "{\"d\":{\"FirstName\":\"Keivan\"}}";
  }
}

Ответы [ 6 ]

4 голосов
/ 05 декабря 2009

Когда вы помечаете сервис как ScriptService, он автоматически обрабатывает сериализацию JSON. Вы не должны вручную сериализовать ответ.

Если вы хотите, чтобы возврат возвращался как «FirstName», то вы можете использовать класс DTO для управления синтаксисом. Просто возвращая строку, она возвращается как {'d': 'Keivan'} вместо {'d': {'FirstName': 'Keivan'}}.

[ScriptService]
public class CallDequeue : System.Web.Services.WebService
{
  public class PersonDTO
  {
    public string FirstName;
  }

  [WebMethod]
  public PersonDTO Dequeue()
  {
    var p = new PersonDTO();

    p.FirstName = "Keivan";

    return p;
  }
}

Несколько изменений в синтаксисе вызова:

jQuery(document).ready(function() {
  jQuery.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "CallDequeue.asmx/Dequeue",
    data: "{}",
    dataType: "json",
    success: function(Msg) {
      // Unless you're using 2.0, the data comes back wrapped
      //  in a .d object.
      //
      // This would just be Msg.d if you return a string instead
      //  of the DTO.
      alert('success:' + Msg.d.FirstName);
    },
    error: function(Msg) {
      alert('failed:' + Msg.status + ':' + Msg.responseText);
    }
  });
});

Вы можете прочитать подробнее о оболочке .d в ASP.NET AJAX здесь , если вам интересно.

Обновление:

Используя ASP.NET 2.0, вам необходимо установить ASP.NET AJAX Extensions v1.0 . Кроме того, убедитесь, что ваш web.config настроен для ASP.NET AJAX (в частности, раздел HttpHandlers).

2 голосов
/ 05 декабря 2009

Этот вопрос, скорее всего, поможет вам.

В противном случае я преобразовал этот веб-сервис в метод страницы, и он сразу заработал. У вас есть такой вариант?

CS:

public partial class test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    public static string Dequeue()
    {
        return "{\"d\":{\"FirstName\":\"Keivan\"}}";
    }
}

ASPX:

<script type="text/javascript">
    jQuery(document).ready(function()
    {
            jQuery.ajax({
            type: "POST",
              contentType: "application/json; charset=utf-8",
              url: "test.aspx/Dequeue",
              data: "{}",
              dataType: "json",
              success: function(Msg)
              {
                    alert('success:' + Msg.responseText);
              },
              error: function(Msg)
              {
                    alert('failed:' + Msg.status + ':' + Msg.responseText);
              }
            });     
    });

Проверьте это и другие статьи Encosia для получения дополнительной информации.

0 голосов
/ 17 января 2012

Спасибо всем респондентам.

Обязательно добавьте эти атрибуты перед используемыми методами

[WebMethod] 
[ScriptMethod] 

Не уверен, когда нужен ScriptMethod?

Любопытно, что он НЕ имел [Script Service] и [WebMethod] в своем коде загрузки.

В любом случае, ошибки aJax 500 12030 12031 исчезли после вышеуказанных изменений.

0 голосов
/ 06 декабря 2009

Попробуйте пометить свой веб-метод с помощью [ScriptMethod]

Как в:

[WebMethod]
[ScriptMethod]
0 голосов
/ 06 декабря 2009

Такой простой ответ. В моем файле web.config не был включен ajax, поэтому все вызовы (независимо от того, что мой веб-сервис являлся скриптовым сервисом) возвращали XML вместо чистого json.

0 голосов
/ 05 декабря 2009

вы говорите, что это JSON, но он возвращает XML. я вижу небольшое разъединение там.

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