¿Devoluciones de llamada de JavaScript ASP.NET sin devoluciones de datos completas?

StackOverflow https://stackoverflow.com/questions/27258

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy a punto de iniciar una función bastante pesada de Ajax en la aplicación de mi empresa.Lo que debo hacer es realizar una devolución de llamada Ajax cada pocos minutos que un usuario haya estado en la página.

  • No necesito realizar ninguna actualización de DOM antes, después o durante las devoluciones de llamada.
  • No necesito ninguna información de la página, solo de una cookie del sitio que siempre debe enviarse con las solicitudes de todos modos y un valor de ID.

Lo que tengo curiosidad por saber es si existe alguna forma limpia y sencilla de realizar una devolución de llamada de JavaScript Ajax a una página ASP.NET sin publicar el resto de la información de la página.Me gustaría no tener que hacer esto si es posible.

Realmente sólo quiero poder llamar a un único método en la página, nada más.

Además, estoy restringido a ASP.NET 2.0, por lo que no puedo usar ninguna de las nuevas funciones ASP AJAX del marco 3.5, aunque puedo usar las extensiones ASP AJAX para el marco 2.0.

ACTUALIZAR
he decidido aceptar danpLa respuesta ya que parece ser exactamente lo que estoy buscando.Nuestro sitio ya usa jQuery para algunas cosas, por lo que probablemente usaré jQuery para realizar solicitudes ya que, según mi experiencia, parece funcionar mucho mejor que el marco AJAX de ASP.

¿Cuál crees que sería el mejor método para transferir datos al IHttpHandler?¿Debo agregar variables a la cadena de consulta o PUBLICAR los datos que necesito enviar?

Lo único que creo que tengo que enviar es una identificación única, pero no puedo decidir cuál es el mejor método para enviar la identificación y que IHttpHandler lo maneje.Me gustaría encontrar una solución que impida que una persona con conocimientos básicos de informática acceda accidental o intencionalmente a la página directamente o repita solicitudes.es posible?

¿Fue útil?

Solución

Si no desea crear una página en blanco, puede llamar a un archivo IHttpHandler (ashx):

public class RSSHandler : IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";

            string sXml = BuildXMLString(); //not showing this function, 
            //but it creates the XML string
            context.Response.Write( sXml );
        }

        public bool IsReusable
        {
            get { return true; }
        }

    }

Otros consejos

Debe utilizar las devoluciones de llamada de ASP.Net que se introdujeron en Asp.Net 2.0.Aquí hay un artículo que debería ayudarlo a comenzar:

Implementación de devoluciones de llamadas de clientes mediante programación sin devoluciones de datos en páginas web ASP.NET

Editar:Mira también esto:Serialización de JavaScript basada en ICallback y JSON

¿Cuál crees que sería el mejor método para transferir datos al IHttpHandler?¿Debo agregar variables a la cadena de consulta o PUBLICAR los datos que necesito enviar?Lo único que creo que tengo que enviar es una identificación única, pero no puedo decidir cuál es el mejor método para enviar la identificación y que IHttpHandler lo maneje.Me gustaría encontrar una solución que impida que una persona con conocimientos básicos de informática acceda directa o accidentalmente a la página.

Teniendo en cuenta que la devolución de llamada está oculta en el código del cliente, se necesitaría alguien con la misma determinación para obtener la cadena de consulta o la solicitud POST.Es decir, si tienen Firebug, estás igualmente jodido.

Entonces, en ese caso, haz lo que te resulte más fácil (Pista:Solo usaría la cadena de consulta).

Para manejar solicitudes repetidas/acceso directo, generaría una clave que se envía con cada solicitud.Quizás un hash de la hora actual (Fuzzy, bajaría a minutos, pero no a segundos debido a la latencia de la red) + la IP del cliente.

Luego, en HTTPHandler, realice el mismo hash y ejecútelo solo si coinciden.

No solo está restringido a ASP.NET AJAX, sino que puede usar cualquier biblioteca de terceros como jQuery, YUI, etc. para hacer lo mismo.Luego puede simplemente realizar una solicitud a una página en blanco de su sitio que debería devolver los encabezados que contienen las cookies.

Mi voto también está a favor de la sugerencia de HTTPHandler.Utilizo esto a menudo.Debido a que no invoca una instancia de la clase de página, es muy liviano.

Todos los trucos del marco ASP.NET AJAX en realidad crean instancias y crean la página completa nuevamente en el backend por llamada, por lo que consumen enormes recursos.

Por lo tanto, mi estilo típico de XmlHttpRequest vuelve a ser un HttpHandler.

Como solo estás usando ASP.NET 2.0, recomendaría AjaxPro voluntad que creará el archivo .ashx.Todo lo que tiene que hacer es introducir AjaxPro.dll en su sitio web.Desarrollé una aplicación completa con AjaxPro y descubrí que funcionó muy bien.Utiliza la serialización para pasar objetos de un lado a otro.

Esto es sólo una muestra de cómo utilizarlo de forma sencilla.

namespace MyDemo
{
  public class Default
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      AjaxPro.Utility.RegisterTypeForAjax(typeof(Default));
    }

    [AjaxPro.AjaxMethod]
    public DateTime GetServerTime()
    {
      return DateTime.Now;
    }
  }
}

Para llamarlo a través de JavaScript es tan simple como

function getServerTime()
{
  MyDemo._Default.GetServerTime(getServerTime_callback);  // asynchronous call
}

// This method will be called after the method has been executed
// and the result has been sent to the client.

function getServerTime_callback(res)
{
  alert(res.value);
}

EDITAR

También tienes que agregar

A la configuración.AjaxPro también funciona bien junto con APS.NET Ajax y puede pasar objetos C# del Cliente al Servidor si la clase está marcada como [Serializable].

Solo para ofrecer una perspectiva diferente, también puedes usar un PageMethod en tu página principal.Dave Ward tiene una buena publicación que ilustra este.Básicamente, utilizas la publicación jQuery ajax para llamar al método, como se ilustra en la publicación de Dave:

$.ajax({
    type: "POST",
    url: "Default.aspx/GetFeedburnerItems",
    // Pass the "Count" parameter, via JSON object.
    data: "{'Count':'7'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
      BuildTable(msg.d);
    }
  });

No se necesitan extensiones Asp.Net Ajax en absoluto.

También puede utilizar WebMethods que están integrados en la biblioteca ajax de asp.net.Simplemente crea un método estático en el código subyacente de la página y lo llama desde su Ajax.

Hay un ejemplo bastante básico de cómo hacerlo. aquí

Debes utilizar un servicio web (.asmx).Con ASP.NET AJAX de Microsoft puedes incluso generar automáticamente los resguardos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top