Почему XMLHttpRequest.status == 0 во всех браузерах, кроме IE? - PullRequest
0 голосов
/ 27 октября 2010

Я схожу с ума с этим ...

Я создал веб-сервис RESTful.NET с C # и работает как автономный сервис. Когда я делаю XMLHttpRequest для извлечения данных JSON, все браузеры не работают, кроме IE, потому что флаг состояния экземпляра XMLHttpRequest всегда равен 0 - это должно быть 200, что происходит с IE.

Я уже прочитал, что 0 - это правильное значение для статической HTML-страницы, которой нет на веб-сервере. Итак, я установил Apache и поместил страницу там, но результат тот же (возможно, я неправильно интерпретировал предложение ...)

Я запустил Fiddler, и запросы всегда корректно извлекаются для любого браузера!

Вот код JavaScript, который я использую:

<script type="text/javascript">

var serviceURI = 'http://localhost:8889/WebService/client/25';
var xmlHttp = new XMLHttpRequest();

function clientHandler()
{
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
    {
        var json = xmlHttp.responseText;
        var client_id = document.getElementById('clientid');
        var client_name = document.getElementById('clientname');
        var client_address = document.getElementById('clientaddress');
        var client_phone = document.getElementById('clientphone');

        var client = eval('(' + xmlHttp.responseText + ')');
        client_id.value = client.id;
        client_name.value = client.name;
        client_address.value = client.address;
        client_phone.value = client.phoneNumber;
    }
    else
        alert("Error:\nxmlHttp.responseText = " + xmlHttp.responseText + "\nstatus = " + xmlHttp.status);
}

function sendRequest()
{
    if (xmlHttp)
    {
        xmlHttp.onreadystatechange = clientHandler;
        xmlHttp.open('GET', serviceURI, true);
        xmlHttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        xmlHttp.send(null);
    }
    else
        alert('xmlHttp not defined!');
}
</script>

Я был бы очень рад, если бы кто-нибудь мог объяснить мне, что происходит; Я не нашел никакого прискорбного объяснения этому ...

Кроме того, лучше ли использовать для этой работы фреймворк, такой как jQuery?

Спасибо всем!

PS: Я консультировался с Джоном Фландерсом в RESTful.NET, но это мало помогает в решении этой проблемы ...: (

Редактировать: Я переместил ответ на этот вопрос в комментарий ниже!

Ответы [ 2 ]

3 голосов
/ 31 октября 2010

Настоящая проблема связана с той же политикой происхождения . Я нашел 2 статьи о StackOverflow, которые помогли мне определить проблему:

Решение проблемы здесь ! Я добавил следующую строку в метод сервера:

WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");

При добавлении этой строки для каждого метода заголовок ответа выглядит следующим образом:

HTTP/1.1 200 OK
Content-Length: 81
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/1.0
Access-Control-Allow-Origin: *
Date: Sun, 31 Oct 2010 02:34:34 GMT

<json data>

Таким образом, сервис работает в Firefox, Safari, Chrome и IE. Но, как сказано в ссылке с ответом, должен быть лучший способ решить эту проблему. Я постараюсь найти что-нибудь об этом:)

3 голосов
/ 27 октября 2010

Internet Explorer использует объект, отличный от других браузеров, для выполнения запросов Ajax.
Microsoft использовала объект Microsoft.XMLHTTP, в то время как другие браузеры используют объект XMLHttpRequest.

Здесь есть статья, объясняющая это и объясняющая, как сделать обходной путь.

http://ajaxpatterns.org/Cross-Browser_Component

Лучше всего использовать одну из множества библиотек для выполнения запросов Ajax. Я буду обрабатывать абстракцию для вас. Я вижу, что ваш пост помечен как C #. Если это так, и вы разрабатываете страницы с Asp.NET, вы можете использовать стандартные инструменты Ajax Asp.Net (ScriptManager и UpdatePanel), хотя очень многие предпочитают использовать JQuery.

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