Wywołanie zwrotne JSONP nie jest wykonywane podczas pracy na localhost

To dziwne, zastanawiałem się, czy ktoś może rzucić trochę światła na to, dlaczego tak się stało.

Zasadniczo wyciągam włosy, próbując przetestować JSONP, dzięki czemu mogę zaimplementować usługę internetową JSON, z której mogą korzystać inne witryny. Zajmuję się rozwojem na localhost - w szczególności na wbudowanym serwerze WWW Visual Studio 2008 i Visual Studio 2008.

Więc jako testowy test JSONP w / jQuery zaimplementowałem następujące:

$().ready(function() {
  debugger;
  try {
    $.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
        alert(data.abc);
    });
  } catch (err) {
    alert(err);
  }
});

I na serwerze ..

<%= Request["callback"] %>({abc : 'def'})

Więc co się dzieje, ustawiam punkt przerwania na serwerze i otrzymuję punkt przerwania zarówno w pierwszym „debuggerze”; statystyka zarówno w skrypcie po stronie klienta, jak i na serwerze. URL JSONP jest rzeczywiście wywoływany po załadowaniu strony. To działa świetnie.

Problem, który miałem, polegał na tym, że wywołanie zwrotne nigdy nie zostanie wykonane. Przetestowałem to zarówno w IE8, jak i Firefox 3.5. Żaden z nich nie wywoła wywołania zwrotnego. Również catch (err) nigdy nie został osiągnięty. Nic się nie stało!

Utknąłem na tym przez tydzień, a nawet przetestowałem z ręcznie wpisanym żądaniem HTTP w Telnet na określonym porcie, aby upewnić się, że serwer zwraca format ...

callbackfn({abc : 'def'})

.. i to jest.

Wtedy dotarło do mnie, że jeśli zmienię nazwę hosta z localhost na localhost za pomocą globalizatora („.”), Tj.http://localhost.:41559/&nbsp;zamiasthttp: // localhost: 41559 /&nbsp;(tak, dodanie kropki do dowolnej nazwy hosta jest legalne, to do DNS coglobal::&nbsp;jest do przestrzeni nazw C #). A potem zadziałało! Internet Explorer i Firefox 3.5 w końcu pokazały mi komunikat ostrzegawczy, gdy dodałem kropkę.

Więc zastanawiam się, co tu się dzieje? Dlaczego późne generowanie tagów skryptowych działa z nazwą hosta internetowego, a nie ze zwykłym hostem lokalnym? Czy to właściwe pytanie?

Oczywiście jest to realizowane ze względów bezpieczeństwa, ale co próbują zabezpieczyć? Czy po uruchomieniu tej funkcji z kropką odsłoniłem lukę bezpieczeństwa w tej funkcji zabezpieczeń?

Nawiasem mówiąc, mój plik hosts, choć zmieniony dla innych hostów, nie ma nic szczególnego w localhost; domyślne 127.0.0.1 / :: 1 są nadal na miejscu, bez przesłaniania poniżej.

DZIAŁANIA NASTĘPCZE:&nbsp;Przeszłam przez to w celu rozwoju lokalnego, dodając:

127.0.0.1   local.mysite.com

.. do mojego pliku hosts, 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);
    }
}