Обратный вызов JSONP не выполняется при запуске на локальном хосте
Это странно, мне было интересно, если кто-нибудь может пролить свет на то, почему это произошло.
По сути, я пытался протестировать JSONP, чтобы реализовать веб-сервис JSON, который могут использовать другие сайты. Я занимаюсь разработкой на локальном хосте, в частности, на Visual Studio 2008 и Visual Studio 2008, на встроенном веб-сервере.
Так что в качестве JSONP-теста с w / 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. Ни один из них не вызвал бы обратный вызов. Улов (err) также никогда не был достигнут. Ничего не случилось вообще!
Я застрял на этой неделе и даже протестировал HTTP-запрос с ручным ключом в Telnet на указанном порту, чтобы убедиться, что сервер возвращает формат ...
callbackfn({abc : 'def'})
.. и это.
Затем до меня дошло, что если я изменю имя хоста с локального на локальный с помощью глобализатора ("."), Т.е.http://localhost.:41559/ вместоHTTP: // локальный: 41559 / (да, добавление точки к любому имени хоста является законным, это для DNS, чтоglobal::
это C # пространства имен). И тогда это сработало! Internet Explorer и Firefox 3.5 наконец-то показали мне предупреждающее сообщение, когда я только что добавил точку.
Так что это заставляет меня задуматься, что здесь происходит? Почему поздняя генерация тегов скрипта будет работать с именем хоста в Интернете, а не с простым localhost? Или это правильный вопрос?
Очевидно, что это реализовано в целях безопасности, но что они пытаются обезопасить? И, заставив его работать с точкой, я только что обнаружил дыру в безопасности в этой функции безопасности?
Кстати, мой файл hosts, хотя и изменен для других хостов, не имеет ничего особенного с localhost; 127.0.0.1 / :: 1 по умолчанию все еще на месте без переопределений ниже.
FOLLOW-UP: Я прошел мимо этого для целей местного развития, добавив:
127.0.0.1 local.mysite.com
.. в мой файл hosts, затем добавьте следующий код в мой 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);
}
}