El monstruito no soy yo, es el SharePoint

El Blog de Luis Mañez, dedicado a tecnologías MS, principalmente SharePoint y Office 365

SharePoint 2010: Cacheando webparts visuales con OutputCache

¿Te va lento tu sitio de SharePoint? … menuda preguntita

Si la respuesta es que sí, o al menos, crees que sí, es posible que este post te pueda ayudar. Ojo, no voy a preguntar, cómo has llegado hasta esa “lentitud”, y ya te aseguro, que habrá muchas más soluciones, pero aquí vamos a ver una posible solución, bastante rápida de probar, y de deshacer en caso de que no te sirva.

Otra condición para que te pueda ser útil tu post, es que tu desarrollo haga uso de UsersControls de asp.net (si tienes webparts visuales, tienes UserControls Sonrisa)

Y la última condición, es la de siempre, cuando se trata de Cache, y es que la información que muestras en ese caso, no necesitas que sea “tiempo real”

Un caso concreto, bastante típico, es cuando has desarrollado algún control para una navegación personalizada. Es muy posible que tengas algoritmos recursivos complejos, que penalizan el rendimiento, y también es muy posible, que ese menú, cambie muy de vez en cuando.

Al lío. Partimos de un visual webpart. Si queremos cachear el contenido que genera ese user control, es tan sencillo como usar la directiva OutputCache sobre el .ascx:

   1: <%@ OutputCache Duration="10" VaryByParam="None" %>

El atributo Duration indica el tiempo que se cacheará el contenido, y se expresa en segundos. El atributo VaryByParam, ahora luego lo explicaremos. De momento lo dejamos a “None”, que indica que no se tenga en cuenta (es obligado indicar algún valor).

Para probar que se cachea, vamos a añadir una etiqueta a nuestro control, que muestre la hora actual:

   1: public partial class CachedWebPartUserControl : UserControl
   2: {
   3:     protected void Page_Load(object sender, EventArgs e)
   4:     {
   5:         String message = String.Format("Time: {0}", DateTime.Now);
   6:         lblInfo.Text = message;
   7:     }
   8: }

Hacemos el deploy y lo añadimos a una página.

image

No se puede ver, pero cuando refresco el navegador, el valor sigue siendo el mismo, hasta dentro de 10 segundos, que se refresca a la hora actual. Funciona!! Sonrisa

¿Y que ocurre si mi webpart, muestra datos en función de algún parámetro que llega por QueryString? Pues para eso, podemos utilizar el VaryByParam, indicando el nombre del parámetro que viaja en la querystring:

   1: <%@ OutputCache Duration="10" VaryByParam="option" %>

Si modificamos ligeramente el código del usercontrol con:

   1: protected void Page_Load(object sender, EventArgs e)
   2: {
   3:     string option = Request.QueryString["option"];
   4:  
   5:     if (String.IsNullOrEmpty(option))
   6:     {
   7:         option = "A";
   8:     }
   9:  
  10:     String message = String.Format("QuestyString option: {1}. Time: {0}", DateTime.Now, option);
  11:     lblInfo.Text = message;
  12: }

Y volvemos a probar, veremos que en este caso, el contenido se cachea según el valor de la querystring “option”. Por ejemplo, cargamos la página por primera vez, y obtenemos:

QuestyString option: A. Time: 3/23/2012 6:29:54 PM

Si acto seguido (antes de que pasen los 10 segundos), cargamos la página de nuevo, pero pasando por querystring: “?option=B”, tenemos:

QuestyString option: B. Time: 3/23/2012 6:29:58 PM

Fijaros que todavía no se han cumplido los 10 segundos, y vemos un valor actualizado con la “option=B”.

Te recomiendo que le eches un vistazo a todas las posibilidades de la directiva OutputCache, ya que tiene más opciones que quizá te interesen (por ejemplo, cachear, no en función de un parámetro, sino del valor que tome otro control: listbox, textbox, etc).

Para acabar, otra recomendación importante, es que antes de hacer nada, midas que es lo que está causando ese mal rendimiento. Porque: ¿seguro que va lento? ¿seguro que es un problema de tu código? (igual es la red, o que el servidor está mal dimensionado, o la instalación, o la alineación de Júpiter con Saturno…)

Para medir esto, podemos utilizar 2 objetos:

Lecturas recomendadas:

Articulos panel del desarrollador (Por Gustavo Velez):

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=4&itm=972

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=art&itm=1417

http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=1&itm=1433

Serie “Developing for Perfomance” (por Tobias Zimmergren)

http://www.zimmergren.net/technical/sp-2010-developing-for-performance-part-1-developer-dashboard

Posted: 27/3/2012 18:00 por Luis Mañez | con no comments |
Comparte este post: