To dziwne, zastanawiałem się, czy ktoś mógłby rzucić nieco światła na to, dlaczego tak się stało.Oddzwanianie JSONP nie jest wykonywane podczas pracy pod adresem localhost
W zasadzie wyciągam włosy, próbując przetestować JSONP, aby móc wdrożyć usługę WWW JSON, z której mogą korzystać inne witryny. Zajmuję się rozwojem na localhost - konkretnie, Visual Studio 2008 i Visual Studio 2008 wbudowany serwer WWW.
Tak jak próbny JSONP w/jQuery, I wdrożone następujące:
$().ready(function() {
debugger;
try {
$.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
alert(data.abc);
});
} catch (err) {
alert(err);
}
});
A na serwerze ..
<%= Request["callback"] %>({abc : 'def'})
Więc co kończy się dzieje jest ustawić punkt przerwania na serwer i otrzymuję punkt przerwania zarówno na pierwszym "debuggerze;" w skryptach po stronie klienta, a także na serwerze. Adres URL JSONP jest rzeczywiście wywoływany po załadowaniu strony. To działa świetnie.
Problem polegał na tym, że wywołanie zwrotne nie zostało wykonane. Testowałem to zarówno w IE8, jak i Firefox 3.5. Żadne nie wywołałoby wywołania zwrotnego. Nie udało się też złapać haka (err). Nic się w ogóle nie wydarzyło!
bym został zatrzymany w tej sprawie przez tydzień, a nawet przetestowany z ręcznie wpust żądanie HTTP w Telnet na określonym porcie, aby mieć pewność, że serwer jest zwrócenie format ...
callbackfn({abc : 'def'})
.. i to jest.
Potem przyszło mi do głowy, co jeśli zmienię nazwę hosta z localhost na localhost z globalizatorem ('.'), Tj. http://localhost.:41559/ zamiast http://localhost:41559/ (tak, dodanie kropki do dowolnej nazwy hosta jest legalne, to do DNS co global::
dotyczy przestrzeni nazw C#). A potem zadziałało! Internet Explorer i Firefox 3.5 w końcu pokazały mi komunikat ostrzegawczy, kiedy właśnie dodałem kropkę.
Więc to mnie zastanawia, co tu się dzieje? Dlaczego późniejsze generowanie tagów skryptów działa z nazwą hosta internetowego, a nie zwykłym hostem lokalnym? Czy to właściwe pytanie?
Oczywiście jest to realizowane ze względów bezpieczeństwa, ale co one próbują zabezpieczyć? A po uruchomieniu go z kropką, czy właśnie ujawniłem lukę bezpieczeństwa w tej funkcji bezpieczeństwa?
Nawiasem mówiąc, mój plik hosts, podczas gdy dla innych hostów został zmieniony, nie ma nic szczególnego z localhostem; domyślne 127.0.0.1/:: 1 są nadal na miejscu, bez poniższych przesłonięć.
KONTYNUACJA: mam przeszłość to dla celów rozwoju lokalnego dodając:
127.0.0.1 local.mysite.com
.. złożyć moi gospodarze, a następnie dodając następujący kod do mojego 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);
}
}
Proponuję użyć narzędzi takich jak firebug i sprawdzić, czy żądanie "skryptu" jest wykonywane dla rzeczy JSONP, i faktycznie zobaczyć, jakie dane wraca. –
Dane były prawidłowe. Zgodnie z opisem, obejściem było odejście od localhost (skrypt i dane pozostały bez zmian) i to "naprawiono", ale nie wyjaśniono w pełni, co się dzieje. –
tak, dlatego sugeruję rejestrowanie zdarzeń dla niezmodyfikowanej wersji. –