2009-07-23 3 views
3

Я недавно занимался кросс-доменным javascript, используя JSONP и ASP.NET MVC.JQuery, XmlHttpRequest и код состояния 0

Специальное действие контроллера будет отвечать только на запрос POST, это по дизайну.

В IE8 я вижу (через Fiddler2), что ответ верен, и возвращает ответ HTTP 200 вместе с JSONP javascript.

В Firefox, Safari и Chrome ответ по-прежнему возвращается с соответствующим кодом HTTP 200 и содержимым JSONP, единственное различие заключается в том, что объект XmlHttpRequest, используемый JQuery, устанавливает код состояния в 0, а responseText для пустого.

Первоначально я думал, что это связано с предварительным запуском COR HTTP (Http Access Control), в результате чего пользовательский заголовок или тип контента, отличный от text/plain, приведет к отправке дополнительного HTTP-запроса (с помощью OPTIONS) к серверу. Я могу видеть в Fiddler2, что на запрос OPTIONS отвечает HTTP 404.

Веб-сервер IIS7 (но веб-сервер производства будет ящиком IIS6). В IIS7 я вижу стандартный OPTIONSVerbHandler, указанный в обработчиках, но я не уверен, что это на самом деле что-то делает (на самом деле я даже не могу найти документацию о OPTIONSVerbHandler где-нибудь).

Чтобы обойти это, я модифицировал библиотеку JQuery, чтобы не устанавливать настраиваемый заголовок, и изменить тип содержимого в text/plain вместо application/json, и Firefox, наконец, начинает обходить запрос OPTIONS и просто POST-сообщения ,

Проблема по-прежнему заключается в пустом ответе (в соответствии с объектом XmlHttpRequest), хотя Fiddler2 показывает, что успешный ответ HTTP 200 с возвратом содержимого.

Любая помощь?

ответ

4

Оказывается, вы не можете использовать междоменные вызовы с помощью JQuery с помощью POST (что имеет смысл, так как это делает тэг скрипта для вызова). Переключение на GET устранило проблему, и теперь все возвращается правильно.

Пришлось пройти через источник JQuery, чтобы понять это, но спасибо за ответ.

Мэтт

2

Попробуйте использовать firebug в firefox для того, чтобы увидеть, как отправляется фактический запрос. Просмотрите вкладку net, чтобы увидеть HTTP-запрос и ответ. Может быть, что-то неправильно настроено? Я также использую jsonview в firefox для просмотра данных JSON, который устанавливает appcaiton/json mimietype. К сожалению, это не относится к JSONP, но близко.

1

На самом деле НЕ ДЕЛО.Firefox посылает заголовок OPTION, как в следующем:

Вот что становится установленным клиентом в Firefox:

 
OPTIONS /MvcApplication/Json/Test1 HTTP/1.1 
Host: acoheni580 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Origin: http://localhost 
Access-Control-Request-Method: POST 

Mvc не знает, как справиться с этим, потому что он только ищет заголовок POST при использовании атрибута [HttpPost]

Чтобы вручную разрешить это:

//[HttpPost] 
[AcceptVerbs(new string[] {"POST","OPTIONS"})] 
1

Помимо всех очевидных ошибок на стороне клиента, МСИ Причина этого в том, что движок gecko ищет Access-Control-Allow-Origin в заголовке от servlet. Если он его не найдет, он прекратит общение, и вы получите status=0 и statusText=null. Кроме того, moz-nullprincipal в xml синтаксическом анализе. Все эти вещи очень вводят в заблуждение. Все, что вам нужно решить эту проблему:

response.setHeader("Access-Control-Allow-Origin","*"); 

В servlet код и жизни будет хорошо :-)