Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2011, 13:01   #1
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию XmlHttpRequest "Failed to load resource" в chrome

Добрый день

Пытаюсь обратиться к WCF сервису из javascript с помощью XmlHttpRequest.
Вот пример кода. Тут все просто:

Код:
        var req = new XMLHttpRequest();
        req.onreadystatechange = OnReadyState;

        function Test() {                         
            req.open('GET', 'http://localhost:87/helloto/olka', true);
            req.send(null);
        }

        function OnReadyState() 
        {
            if (req.readyState == 4) 
            {
                if (req.status == 200) 
                {
                    alert(req.responseText);
                }
            }        
        }
В IE работает, в Chrome не работает. То есть req.status = Error: INVALID_STATE_ERR: DOM EXCEPTION 11 после выполнения req.open, в консоли пишет "Failed to load resource", далее по приходу в OnReadyState req.status=0.

Кто знает в чем проблема? Буду очень признательна за помощь, ибо перерыла уже все вдоль и поперек.
Hippos вне форума Ответить с цитированием
Старый 19.01.2011, 13:15   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Есть два предположения:
1) Хром не любит, когда обращаются к нестандартным портам, посему дает ошибку.
2) Вы пытаетесь сделать Ajax-запрос до того как страница загрузилась.
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 19.01.2011, 13:21   #3
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от russian-stalker Посмотреть сообщение
Есть два предположения:
1) Хром не любит, когда обращаются к нестандартным портам, посему дает ошибку.
2) Вы пытаетесь сделать Ajax-запрос до того как страница загрузилась.
Запрос выполняется по клику на обычную кнопку, вот он обрабочик

Код:
<input id="btnTest" type="button" runat="server" onclick="Test()" value="Test me" />
Так что 2 не может быть. А вот первое сейчас попробую глянуть.
Hippos вне форума Ответить с цитированием
Старый 19.01.2011, 13:35   #4
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

Так поменяла на http://localhost/helloto/olka

В IE как работало, так и работает. В Chrome почти та же песня, но появилось еще 1 сообщение в консоли. Перед "Failed to load" resource пишет

XMLHttpRequest cannot load http://localhost/helloto/olka. Origin http://localhost:52910 is not allowed by Access-Control-Allow-Origin.

Под http://localhost:52910 как раз запущено веб-приложение. Что это за зверь такой Access-Control-Allow-Origin?
Hippos вне форума Ответить с цитированием
Старый 19.01.2011, 13:44   #5
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

Так что такое Access-Control-Allow-Origin уже понятно. Как его побороть в данном конкретном случае пока непонятно.
Hippos вне форума Ответить с цитированием
Старый 19.01.2011, 13:47   #6
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Попробуйте у страницы, из которой работает Ajax-запрос установить хидер:
Код:
Access-Control-Allow-Origin: *
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 19.01.2011, 13:51   #7
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Все просто, вы пытайтесь по средствам js передать запрос на другой домен(сервер), а для всех браузеров , кроме IE, установлено правило политики безопасности: Same Origin Policy
Есть несколько способов обхода, юзайте гугл.
uberchel на форуме Ответить с цитированием
Старый 19.01.2011, 14:17   #8
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от uberchel Посмотреть сообщение
Все просто, вы пытайтесь по средствам js передать запрос на другой домен(сервер), а для всех браузеров , кроме IE, установлено правило политики безопасности: Same Origin Policy
Есть несколько способов обхода, юзайте гугл.
Это я уже поняла. Гугл юзаю, но тему пока не закрывайте. Так как решения, по крайней мере, у меня еще нет.
Hippos вне форума Ответить с цитированием
Старый 19.01.2011, 14:26   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а пост номер 6 не пробывали?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2011, 17:26   #10
Hippos
 
Регистрация: 19.01.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от russian-stalker Посмотреть сообщение
Попробуйте у страницы, из которой работает Ajax-запрос установить хидер:
Код:
Access-Control-Allow-Origin: *
Насколько я поняла стандарт CORS, из к примеру вот этой умной статьи, то хидеры надо модифицировать как на клиенте так и на сервере.
Решить вопрос можно сделав вот так, как написано в этом примере (конкретно последний листинг в global.asax вносятся нужные изменения).
Однако, это решение мне не подходят, потому что здесь они используют WCF сервис, который хостится под IIS. Однако, мой WCF сервис - self-hosted сервис (который хостится либо как обычное консольное приложение, либо как виндовый сервис). Соответственно, ни о каком global.asax речи быть не может.

То есть вопрос надо переформулировать: как выполнить подобный код

Код:
        private void EnableCrossDmainAjaxCall()
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
                          "http://localhost:5187");
 
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", 
                              "GET, POST");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                              "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                              "1728000");
                HttpContext.Current.Response.End();
            }
        }
из Self-Hosted WCF сервиса? Похоже, что мне с этим надо уже в другой раздел
Hippos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как исправить ошибку "chacheManager error: Writing index data failed!" spravka Помощь студентам 3 07.11.2010 01:42
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Ошибка "Cannot load driver" zallza Общие вопросы Delphi 2 25.03.2010 21:21
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04