Это странно, мне было интересно, может ли кто-нибудь пролить свет на то, почему это произошло.Обратный вызов JSONP не выполняется при запуске на localhost
В принципе, я вытягивал свои волосы, пытаясь проверить JSONP, поэтому я могу реализовать веб-сервис JSON, который могут использовать другие сайты. Я занимаюсь разработкой на localhost - в частности, Visual Studio 2008 и встроенным веб-сервером Visual Studio 2008.
Так как испытание JSONP ж/JQuery, я осуществил следующее:
$().ready(function() {
debugger;
try {
$.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
alert(data.abc);
});
} catch (err) {
alert(err);
}
});
А на сервере ..
<%= Request["callback"] %>({abc : 'def'})
Так что в конечном итоге происходит, я поставил точку останова сервер, и я получаю точку останова как на первом «отладчике»; statment в клиентском скрипте, а также на сервере. URL-адрес JSONP действительно вызывается после загрузки страницы. Это отлично работает.
Проблема, с которой я столкнулся, заключалась в том, что обратный вызов никогда не будет выполняться. Я тестировал это как в IE8, так и в Firefox 3.5. Ни один из них не будет ссылаться на обратный вызов. Уловка (ошибка) так и не была достигнута. Ничего не произошло!
я застрял на этом в течение недели, и даже протестирована с запросом вручную шпоночным HTTP в Telnet на указанном порту, чтобы быть уверенным, что сервер возвращает формат ...
callbackfn({abc : 'def'})
.. и это.
Потом до меня дошло, что если я изменить имя хоста с локального хоста на локальный с глобализируемых («»), т.е. http://localhost.:41559/ вместо http://localhost:41559/ (да, добавив точку в любое имя хоста является законным, то есть в DNS что global::
относится к пространствам имен C#). И тогда это сработало! Internet Explorer и Firefox 3.5 наконец-то показали мне предупреждение, когда я просто добавил точку.
Так что это заставляет меня задуматься, что здесь происходит? Почему поздняя генерация тегов сценариев работает с именем интернет-хоста, а не с простым локальным хостом? Или это правильный вопрос?
Очевидно, что это реализовано по соображениям безопасности, но что они пытаются обеспечить? И, заставив его работать с точкой, я просто обнаружил дыру в безопасности в этой функции безопасности?
Кстати, файл моих хостов, измененный для других хостов, не имеет ничего общего с localhost; по умолчанию 127.0.0.1/:: 1 все еще на месте без переопределений ниже.
FOLLOW-UP: Я получил это в прошлом для местных целей развития, добавив:
127.0.0.1 local.mysite.com
.. подать мои хозяева, а затем добавить следующий код в моем global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Headers["Host"].Split(':')[0] == "localhost")
{
Response.Redirect(
Request.Url.Scheme
+ "://"
+ "local.mysite.com"
+ ":" + Request.Url.Port.ToString()
+ Request.Url.PathAndQuery
, true);
}
}
Я предлагаю использовать такие инструменты, как firebug, и посмотреть, выполняется ли запрос «скрипт» для материала JSONP, и фактически посмотреть, какие данные возвращаются. –
Данные действительны. Как описано, обходной путь состоял в том, чтобы уйти от локального хоста (сценарий и данные в остальном остались прежними) и что «исправил» его, но не полностью объясняет, что происходит. –
Да, поэтому я предлагаю регистрировать события для незафиксированной версии. –