2008-08-26 12 views
5

Estoy a punto de comenzar una característica pesada de Ajax en la aplicación de mi compañía. Lo que tengo que hacer es hacer una devolución de llamada Ajax cada pocos minutos que un usuario ha estado en la página.JavaScript Callbacks ASP.NET sin Full PostBacks?

  • No necesito hacer 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 de sitio que siempre se debe enviar con solicitudes de todos modos, y un valor de ID.

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

Realmente solo quiero poder llamar a un solo 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 características de ASP AJAX de 3.5 framework, aunque puedo usar las extensiones ASP AJAX para el framework 2.0.

ACTUALIZACIÓN
he decidido aceptar la respuesta DanP 's, ya que parece ser exactamente lo que estoy buscando. Nuestro sitio ya usa jQuery para algunas cosas, así que probablemente usaré jQuery para hacer solicitudes, ya que en mi experiencia parece funcionar mucho mejor que el framework 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 POST los datos que necesito enviar?

Lo único que creo que debo enviar es un único ID, pero no puedo decidir cuál es el mejor método para enviar el ID y hacer que IHttpHandler lo administre. 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 repitiendo solicitudes. es posible?

Respuesta

6

Si no desea crear una página en blanco, se podría llamar 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; } 
     } 

    } 
2

No solo está restringido a ASP.NET AJAX, sino que también puede utilizar cualquier biblioteca de terceros como jQuery, YUI, etc. para hacer lo mismo. A continuación, puede simplemente hacer una solicitud a una página en blanco en su sitio que debe devolver los encabezados que contienen las cookies.

-1

También puede utilizar webMethods que se construye en la biblioteca asp.net ajax. 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 muy básico de cómo hacerlo here

-1

Debe utilizar un servicio web (.asmx). Con ASP.NET AJAX de Microsoft, incluso puede generar automáticamente los talones.

2

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

Todos los trucos de marcos AJAX de ASP.NET realmente crean una instancia y crean toda la página nuevamente en el back-end por llamada, por lo que son enormes cerdos de recursos.

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

3

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

Teniendo en cuenta la devolución de llamada está enterrado en el código de cliente, se necesitaría a alguien con la misma determinación para obtener la consulta o la solicitud POST. IE, si tienen firebug, tu igualmente atornillado.

Entonces, en ese caso, haz lo que sea más fácil para ti (Sugerencia: usaría la cadena de consulta).

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

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

1

Dado que utiliza únicamente ASP.NET 2.0, recomendaría AjaxPro que creará el archivo .ashx. Todo lo que tienes que hacer es tirar el AjaxPro.dll a tu sitio web. Desarrollé una aplicación completa con AjaxPro y encontré que funcionó muy bien. Utiliza la serialización para pasar objetos de un lado a otro.

Esto es solo una muestra de cómo simplemente usarlo.

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 llamar 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 hay que añadir

Para la config. AjaxPro también funciona bien al lado de APS.NET Ajax y puede pasar objetos C# de Cliente a Sever si la clase está marcada como [Serializable]

1

Solo para ofrecer una perspectiva diferente, también puede usar un PageMethod en su pagina principal. Dave Ward tiene una buena publicación que illustrates esto.Esencialmente se utiliza jQuery Ajax después de llamar al método, como se ilustra en el post 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 hay necesidad de extensiones Asp.Net Ajax en absoluto.