viernes, 23 de octubre de 2009

Añadiendo HttpModules al CRM

Los "HttpModules" son clases que implementan la interfaz System.Web.IHttpModule que nos permiten capturar los métodos que se lanzan en las diferentes etapas del proceso de las peticiones web.
Consiste básicamente en una clase (.dll) que es llamada directamente cuando ocurren determinados eventos.
De esta forma, podríamos crear nuestras propias clases en .NET que sean llamadas cuando se navegue por el CRM.
Para mas información acerca de los HttpModules recomiendo ir a http://msdn.microsoft.com/es-es/library/9b9dh535(VS.80).aspx
Antes de continuar, responderé a la pregunta que se estarán haciendo, obviamente esta funcionalidad no esta soportada por CRM.
La funcionalidad que nos puede aportar esto es practicamente infinita, ya que podremos "meter" código nuestro en la ejecución del propio CRM.
Voy a poner un ejemplo sencillo. En este caso, lo que voy a hacer es que mientras se navegue por el CRM, vaya escribiendo en la barra de "status" en la parte inferior del navegador, escriba las URL de las páginas que esta cargando.
Los pasos para esto son los siguientes:
1) Lo primero que hay que hacer, es crearse la clase en cuestión y compilarla.
El código es el siguiente:

using System;
using System.Web.UI;
using System.Web;

namespace Httpmodulo
{
public class ExtensionCRM : IHttpModule
{
public event EventHandler BeginRequest;
public void Dispose()
{}
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute += new EventHandler(this.OnPreRequestHandlerExecute);
}
public void OnPreRequestHandlerExecute(object o, EventArgs args)
{
try
{
HttpContext context = ((HttpApplication)o).Context;
IHttpHandler handler = context.Handler;
((Page)handler).PreRender += new EventHandler(this.OnPagePreRender);
}
catch (System.Exception ex){ }
}
public void OnPagePreRender(object sender, EventArgs eventArgs)
{
Page page = (Page)sender;

if (page.Request.QueryString["redirect"] == null)
{
if (!page.Request.FilePath.Contains("css") &&
!page.Request.FilePath.Contains("icon.aspx") &&
!page.Request.FilePath.Contains("fonts.aspx"))
{
page.Response.Write(@"");
}
}
}

}

Como se ve, simplemente en el evento "OnPagePreRender" meto el cñodigo que quiere añadir y de "page.Request.FilePath"recojo el nombre de la página. De todos modos como estamos en el "contexto" de ejecución del CRM podemos recoger mas información.

2) Una vez realizada mi clase, debemos firmar la misma, compilarla y registrarla en la GAC (Global Assembly Cache).

3) El último, que por cierto es lo que no esta soportado por el CRM, es simplemente añadir una línea en el Web.Config del sitio web del CRM, para que cargue nuestra dll:





La "PublicKeyToken" la podemos ver al momento de registrar la dll en la GAC, seleccionandola y pinchando en "propiedades". De allí la copiamos y la ponemos.

Listo, de esta forma bastantemente no soportada, podemos meter código propio en la ejecución del CRM. Por ejemplo puede servir para hacer Logs de paginas abiertas, poder cargar javascripts externos en los "onloads" de los formularios, etc, etc, y lo que se les pueda ocurrir!.

un abrazo!

No hay comentarios:

Publicar un comentario