SharePoint 2010: Como crear y desplegar un HTTP Module!

Junto con los HTTP Handlers, el uso de HTTP Modules en SharePoint 2010 es una alternativa muy interesante cuando queremos realizar ciertas acciones cuando se accede a un sitio de SharePoint sin que el usuario intervenga:

  • Mostrale un diálogo informativo.
  • Realizar una redirección en función de los permisos.
  • Recopilar información del usuario accediendo.
  • ….

Para crear un HTTP Module con las herramientas de desarrollo para SharePoint 2010 de Visual Studio 2010:

  • En Visual Studio 2010 creamos un proyecto de tipo “Empty SharePoint Project”.
  • En el asistente de configuración, indicamos como tipo de despliegue “Deploy as a farm solution”.
image image
  • Una vez creada la estructura del proyecto, añadimos una referencia a System.Web.
  • Añadimos al proyecto un elemento de tipo “Class File” que codificamos la clase de la siguiente forma:
   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using System.Text;

   5:  

   6: //Espacios de nombres necesarios

   7: using Microsoft.SharePoint;

   8: using System.Web;

   9:  

  10: namespace SPHttpModuleSample

  11: {

  12:     public class HttpRedirectModule: IHttpModule

  13:     {

  14:         public void Dispose()

  15:         { }

  16:         public void Init(HttpApplication httpaAppContext)

  17:         {

  18:             httpaAppContext.BeginRequest+=

  19:                 new EventHandler(httpaAppContext_BeginRequest);

  20:         }

  21:  

  22:         void httpaAppContext_BeginRequest(object sender, EventArgs e)

  23:         {

  24:             HttpApplication httpaApplication =

  25:                 (HttpApplication)sender;

  26:             string sRequestUrl = 

  27:                 httpaApplication.Request.Url.ToString();

  28:  

  29:             if (sRequestUrl.Contains("Redirection"))

  30:             {

  31:                 httpaApplication.Response.Write("http://www.ciin.es");

  32:             }

  33:         }

  34:     }

  35: }

  • Como vemos, la clase creada tiene que heredar de IHttpModule. A continuación implementamos el método Init en el que especificamos cuál va a ser el manejador para el objeto HttpApplication correspondiente asociado al HTTP Mudule.
  • En el manejador es dónde meteremos la lógica correspondiente. En mi caso, simplemente estoy escribiendo información en la respuesta devuelta por el servidor únicamente en ciertas páginas que cumplan la condición.
  • Desplegamos el HTTP Module en nuestro entorno y para que SharePoint “se entere” de que está disponible tenemos que editar el Web.Config (o modificarlo de forma programática) para añadir en la sección <modules> la referencia a nuestro HTTP Module. Como veis, se trata de añadir un <add name=”MyModulo”>.
   1: <modules runAllManagedModulesForAllRequests="true">

   2:   <remove name="AnonymousIdentification" />

   3:   <remove name="FileAuthorization" />

   4:   <remove name="Profile" />

   5:   <remove name="WebDAVModule" />

   6:   <remove name="Session" />

   7:   <add name="SPRequestModule" preCondition="integratedMode" type="Microsoft.SharePoint.ApplicationRuntime.SPRequestModule, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

   8:   <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

   9:   <add name="SharePoint14Module" preCondition="integratedMode" />

  10:   <add name="StateServiceModule" type="Microsoft.Office.Server.Administration.StateModule, Microsoft.Office.Server, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

  11:   <add name="PwaAuthentication" type="Microsoft.Office.Project.PWA.PwaAuthenticationModule, Microsoft.Office.Project.Server.PWA, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

  12:   <add name="RSRedirectModule" type="Microsoft.ReportingServices.SharePoint.Soap.RSRedirectModule, RSSharePointSoapProxy, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />

  13:   <add name="PublishingHttpModule" type="Microsoft.SharePoint.Publishing.PublishingHttpModule, Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />

  14:   <add name="HttpRedirectModule" type="SPHttpModuleSample.HttpRedirectModule, SPHttpModuleSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=410ab55a4b3766be" />

  15: </modules>

  • Comprobamos que si accedemos a una página de nuestro sitio que no cumple la condición configurada en el HTTP Module no se escribe nada en la respuesta.
  • En cambio, si la página accedida cumple la condición si que escribimos en la respuesta de vuelta del servidor.
image image