2010-12-30 6 views
6

Я пытаюсь создать запрос ajax для WebService, который возвращает данные с заданными параметрами в XML. Это похоже на работу в IE, но Firefox не может декодировать ответ. Я также могу просмотреть ответ в Fiddler после декодирования. Вот код:

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: 'http:/localhost/webservice.asmx/GetTags?groupId=10', 
     contentType: "text/xml; charset=utf-8", 
     dataType: "xml", 
     success: function(response) { 
      $('#result').html('success',response); 
      $(response).find("string").each(function() { 
       $('#result').append($(this).text()); 
      }); 
     }, 
     error: function(response) { 
      $('#result').html('failure',response); 
     } 
    }); 

}); 

Есть ли способ указать, что ответ необходимо декодировать? Или любой другой способ заставить его работать?

EDIT: @ Nikki9696 - это не JSON, закодированный, поскольку данные возвращаются в XML.

@Oleg - Образец XML можно увидеть в браузере, если доступ к веб-сервиса с помощью URL выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> 
    <string>tag 1</string> 
    <string>tag 2</string> 
    <string>tag 3</string> 
</ArrayOfString> 

Скрипач в TextView возвращает и сообщение

«Response закодирован и может потребоваться до , прежде чем проверять. Нажмите здесь, чтобы преобразовать. "

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

Я немного поиграл со сценарием, похоже, что jQuery может по умолчанию или угадывать некоторые параметры, поэтому dataType, например, не является обязательным. С этими настройками я получаю сообщение об успешном завершении, однако он все еще не знает, что делать с данными. Я попытался установить dataType на «jsonp», как было предложено в каком-то потоке SS (не могу найти его в данный момент, свяжу его, когда я это сделаю), и ошибка изменится на missing ; before statement, я думаю, потому что это не объект JSON, а XML. Есть ли способ заставить webservice возвращать JSON вместо этого?

EDIT 2: Я обновил url, чтобы отразить то, что на самом деле произошло. Извините, я пропустил это, сделав невозможным, чтобы кто-нибудь это заметил.

+0

Когда вы говорите «декодировать», вы имеете в виду, что это кодируется JSON? – Nikki9696

+0

можете ли вы включить данные xml, которые вы получаете из веб-сервиса назад и которые вы видите в Fiddler? – Oleg

ответ

2

Поскольку вы используете относительный URL-адрес, например '/webservice.asmx/GetTags?groupId=10', у вас не было проблем с другим доменом. Мне кажется, что вы должны просто исправить litle свой код JavaScript. Например, следующий код

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: '/WebService1.asmx/GetTags', 
     contentType: "text/xml; charset=utf-8", 
     data: {groupId:10}, 
     success: function (response) { 
      $('#result').html('success:'); 
      $(response).find("string").each(function() { 
       $('#result').append('<br />'+$(this).text()); 
      }); 
     }, 
     error: function (response) { 
      $('#result').html('failure:<br />' + response.responseText); 
     } 
    }); 
}); 

прекрасно работает в Internet Explorer, Firefox и Google Chrome. Если вам нужно, я могу опубликовать URL-адрес, где вы можете загрузить весь рабочий проект Visual Studio 2010.

ОБНОВЛЕНО: Чтобы вернуть JSON вместо XML из веб-метода вы можете заменить [ScriptMethod(UseHttpGet = true)] атрибуту [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] (в .NET 4.0 вы можете сделать то же самое в различных других способов) и изменить код JavaScript к следующему

$(function() { 
    $.ajax({ 
     type: "GET", 
     url: '/WebService1.asmx/GetTagsJson', 
     contentType: "application/json; charset=utf-8", 
     data: { groupId: 10 }, 
     //dataType: "xml", 
     success: function (response) { 
      $('#result').html('success:'); 
      $(response.d).each(function() { 
       $('#result').append('<br />' + this); 
      }); 
     }, 
     error: function (response) { 
      $('#result').html('failure:<br />' + response.responseText); 
     } 
    }); 
}); 
+0

На самом деле путь не был относительным, и это было проблемой. Я вырезал большую часть этого, чтобы упростить пример, и, таким образом, сделать невозможным для кого-либо. Я изменю его, чтобы отразить это. – Shagglez

+0

@Shagglez: URL-адрес вашего вопроса '/webservice.asmx/GetTags?groupId=10' относительный. Кроме того, вы использовали неверный код 'jQuery.html()' (см. Http://api.jquery.com/html/): '$ ('# result'). Html ('success', response) ; '. См. Исправленную версию в своем ответе. – Oleg

+0

СПАСИБО !!! Изменение типа данных в contenttype спасло день !!! – trgraglia

1

Короткий ответ: Я попытался сделать звонок из другого домена в мой веб-сервис.

Вот еще некоторые детали: В Firebug, глядя на вкладке XML я заметил, что Обнаружена ошибка XML Parsing Error: no element found Location: moz-nullprincipal:{757cb587-20da-4d2f-bf80-e3b915a234d4} Line Number 1, Column 1:, поэтому я искал этого конкретного сообщения и наткнулся на кого-то, имеющего тот же вопрос http://forum.jquery.com/topic/jquery-ajax-and-xml-issues-no-element-found. Вот часть, которая решила мою проблему:

Хотя в документации не ясно, вы не можете использовать вызовы AJAX для извлечения данных из других доменов.

Это произошло со мной, что причина, она работала в IE является то, что в первый раз он спросил меня, могу ли я позволил бы сделать этот небезопасный вызов (или некоторые такие), и оно должно быть в виду, сделав Ajax звоните в другой домен. FF никогда не подсказывал мне об этом и, вероятно, отключил вызов по умолчанию.

Сделать перекрестный домен совместимым является проблемой еще на один день, пока он делает все, что мне нужно.

Смежные вопросы