Возврат JSON от ASMX и обработка его правильно в JavaScript

Я понимаю, что существуют тонны подобных вопросов уже здесь, но я не могу понять этого.

У меня есть веб-сервис (C#, .net 3.5). Существенный Код, о котором необходимо знать, - следующие:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WSMember : System.Web.Services.WebService {

    public WSMember () {   
    }


    [WebMethod]
    [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
    public string GetMember(string IdMember)
    {
        //Ignore the parameter for now... I will be looking up a database with it... 
        //For now just return a minimal object:
        Member m = new Member();
        m.Surname = "Smith";
        m.FirstName = "John";
        return new JavaScriptSerializer().Serialize(m);
    }

Кроме того, в web.config я сделал следующее дополнение (который я просто видел на некотором другом сообщении... это нормальное/безопасное?)

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

Затем в Default.aspx, я две ключевых ссылки...

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script type="text/javascript" src="jquery.json-2.2.min.js"  ></script>

jquery.json-2.2.min.js был загружен с кода Google

И Вот JavaScript:

<script type="text/javascript">
         $(document).ready(function() {
             $("#button1").click(function(event) {
                 var myData = { IdMember: "2" };
                 var encoded = $.toJSON(myData);

                 alert(encoded);

                 $.ajax({
                     type: "POST",
                     url: "WSMember.asmx/GetMember",
                     data: encoded,
                     contentType: "application/json; charset=utf-8",
                     dataType: "json",
                     success: function(msg) {
                         alert("worked" + msg.d);
                         //$("#sidebar").append(msg);
                     },
                     error: function(msg) {
                         alert(msg.d);
                         //$("#sidebar").append(msg);
                     }
                 });
             });
         });

    </script>

Когда я выполняю его, закодированный json появляется в окне сообщения как ожидалось... т.е. с двойными кавычками:

{"IdMember": "2"}

Однако это всегда перестало работать. Даже для самого основного Привет Мир без данных, передаваемых в, это перестало работать. Я продолжаю становиться "неопределенным" для данных сообщения.

Если я просто использую предупреждение (сообщение), оно отображается [возражают XMLHttpRequest]

Кто-либо знает, где мои данные теряются??

И другой вопрос... - там что-нибудь существенно неправильно с тем, что я делаю?

Большое спасибо.

Править:

спасибо за парней ответа. Я попробовал следующее так...

UseHttpGet = верный теперь изменяется на ложь. (Снова - я видел его где-нибудь, таким образом, я попробовал его..., но я знал, что это не могло быть правильно :-/)

Скажем, веб-сервис теперь возвращает строку. Я создаю строку следующим образом (кажется немного сумасшедшим... сериализация, она сделала ту же самую вещь...),

    StringBuilder sb = new StringBuilder();
    sb.Append("{");
    sb.Append("\"Surname\":");
    sb.Append("\"");
    sb.Append(m.Surname);
    sb.Append("\"");

    sb.Append(",\"FirstName\":");
    sb.Append("\"");
    sb.Append(m.FirstName);
    sb.Append("\"");

    sb.Append("}");

    return sb.ToString();

Этот код возвращает что-то как:

{"Surname":"Smith","FirstName":"John"}

Я все еще получаю ту же самую ошибку...

Я также попробовал что-то как возврат объектного "участника", таким образом, код становится:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Member GetMember(string IdMember)
{
    Member m = new Member();
    m.Surname = "Smith";
    m.FirstName = "John";

    return m;
}

Это также бросает ту же ошибку.

Извините, что был болью... Я прочитал обе из тех ссылок и других. Просто не видьте почему это несколько отличающееся.

Там дополнительная конфигурация устанавливает, я должен знать возможно??

Большое спасибо за ответы.

ОБНОВЛЕНИЕ: проблема решена. Ключевые ошибки в вышеупомянутом коде:

[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]

должен быть

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Кроме того, на форме, при использовании кнопки для вызова JavaScript я неправильно устанавливал входной тип...

<input id="button1" type="submit" value="Just a test" />

когда это должно сказать:

<input id="button1" type="button" value="Just a test" />

Большое спасибо всем, кто помог.

7
задан thkala 11 December 2011 в 17:08
поделиться

3 ответа

Мне кажется, что ваша основная проблема в том, что вы пытаетесь вручную использовать JavaScriptSerializer().Serialize вместо возврата объекта. Ответ от веб-службы будет в двойной кодировке JSON.

Вы правы! Есть много близких вопросов. Посмотрите здесь Можно ли вернуть JSON из веб-сервиса .asmx, если ContentType не JSON? и Не могу заставить jQuery Ajax разобрать результат JSON веб-сервиса и вы (я надеюсь) найдете ответ.

UPDATED: Извините, но у вас где-то есть небольшая ошибка, которую вы не опубликовали. Чтобы закрыть проблему, я создал небольшой проект со старой версией Visual Studio (VS2008), в котором есть практически точно ваш код, и который работает. Я разместил его на http://www.ok-soft-gmbh.com/jQuery/WSMember.zip. Вы можете скачать его, скомпилировать и убедиться, что он работает. Затем вы можете сравнить свой код с моим и найти свою ошибку.

Best regards

3
ответ дан 7 December 2019 в 14:28
поделиться

Если вы публикуете свои данные, почему вы определяете UseHttpGet = true? Разве это не должно быть ложным, чтобы соответствовать типу ответа на ваш запрос? Кроме того, установка точки останова в вызове ws, чтобы точно увидеть, что возвращает сериализатор, тоже может помочь ... Я не думаю, что он должен возвращать объект JSON, если возвращаемое значение является строкой.

HTH.

1
ответ дан 7 December 2019 в 14:28
поделиться

Да, определенно не сериализуйте объект вручную. Если вы вернете тип Member , инфраструктура выполнит сериализацию JSON за вас.

Когда вы видите предупреждение [object XMLHttpRequest], это звучит так, как будто оно попадает в обработчик ошибок в вашем вызове $ .ajax (), где в ответ передается его объект XHR в качестве первого параметра. Вероятно, вы получаете ошибку 500 на сервере.

Вот пример декодирования ответа об ошибке ASP.NET AJAX в jQuery . Проще всего изменить обработчик ошибок на этот:

error: function(xhr, status, error) {
  var err = eval("(" + xhr.responseText + ")");

  alert(err.Message);
}

Это даст вам некоторое представление о том, что это за конкретная ошибка.

1
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: