La devolución de llamada JSONP no se ejecuta cuando se ejecuta en localhost

Esto es extraño, me preguntaba si alguien podría arrojar algo de luz sobre por qué sucedió esto.

Básicamente, he estado tratando de probar JSONP para poder implementar un servicio web JSON que otros sitios pueden usar. Estoy realizando el desarrollo en localhost, específicamente, Visual Studio 2008 y el servidor web incorporado de Visual Studio 2008.

Entonces, como una prueba de JSONP ejecutada con jQuery, implementé lo siguiente:

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

Y en el servidor ..

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

Entonces, lo que termina sucediendo es que establezco un punto de interrupción en el servidor y obtengo el punto de interrupción tanto en el primer "depurador"; Declaración en el script del lado del cliente, así como en el servidor. De hecho, la URL de JSONP se invoca después de que se carga la página. Eso está funcionando muy bien.

El problema que estaba teniendo era que la devolución de llamada nunca se ejecutaría. He probado esto tanto en IE8 como en Firefox 3.5. Ninguno de los dos invocaría la devolución de llamada. La captura (err) nunca fue alcanzada, tampoco. ¡Nada pasó en absoluto!

Me quedé estancado en esto durante una semana, e incluso lo probé con una solicitud HTTP con clave manual en Telnet en el puerto especificado para estar seguro de que el servidor está devolviendo el formato ...

callbackfn({abc : 'def'})

.. y es.

Entonces me di cuenta, ¿y si cambio el nombre de host de localhost a localhost con un globalizador ('.'), Es decir?http://localhost.:41559/ en lugar dehttp: // localhost: 41559 / (sí, agregar un punto a cualquier nombre de host es legal, es a DNS lo queglobal:: es a los espacios de nombres C #). Y luego funcionó! Internet Explorer y Firefox 3.5 finalmente me mostraron un mensaje de alerta cuando acabo de agregar un punto.

Así que esto me hace preguntarme, ¿qué está pasando aquí? ¿Por qué la generación de etiquetas de script tardía funcionaría con un nombre de host de Internet y no con localhost simple? ¿O es esa la pregunta correcta?

Claramente esto se implementa por razones de seguridad, pero ¿qué están tratando de asegurar? Y, al hacer que funcione con un punto, ¿acabo de exponer un agujero de seguridad en esta función de seguridad?

Por cierto, mi archivo de hosts, mientras está modificado para otros hosts, no tiene nada de especial en localhost; el valor predeterminado de 127.0.0.1 / :: 1 todavía está en su lugar, sin anulaciones a continuación.

SEGUIR: Lo superé para fines de desarrollo local agregando:

127.0.0.1   local.mysite.com

... a mi archivo de hosts, luego agregando el siguiente código a mi 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);
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta