¿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 )
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:
|
<span style="color: #606060" id="lnum1"> 1:</span> <span style="background-color: #ffff00"><%@ OutputCache Duration="10" VaryByParam="None" %></span> |
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:
|
<span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">partial</span> <span style="color: #0000ff">class</span> CachedWebPartUserControl : UserControl |
|
<span style="color: #606060" id="lnum2"> 2:</span> { |
|
<span style="color: #606060" id="lnum3"> 3:</span> <span style="color: #0000ff">protected</span> <span style="color: #0000ff">void</span> Page_Load(<span style="color: #0000ff">object</span> sender, EventArgs e) |
|
<span style="color: #606060" id="lnum4"> 4:</span> { |
|
<span style="color: #606060" id="lnum5"> 5:</span> String message = String.Format(<span style="color: #006080">"Time: {0}"</span>, DateTime.Now); |
|
<span style="color: #606060" id="lnum6"> 6:</span> lblInfo.Text = message; |
|
<span style="color: #606060" id="lnum7"> 7:</span> } |
|
<span style="color: #606060" id="lnum8"> 8:</span> } |
Hacemos el deploy y lo añadimos a una página.
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!!
¿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:
|
<span style="color: #606060" id="lnum1"> 1:</span> <span style="background-color: #ffff00"><%@ OutputCache Duration="10" VaryByParam="option" %></span> |
Si modificamos ligeramente el código del usercontrol con:
|
<span style="color: #606060" id="lnum1"> 1:</span> <span style="color: #0000ff">protected</span> <span style="color: #0000ff">void</span> Page_Load(<span style="color: #0000ff">object</span> sender, EventArgs e) |
|
<span style="color: #606060" id="lnum2"> 2:</span> { |
|
<span style="color: #606060" id="lnum3"> 3:</span> <span style="color: #0000ff">string</span> option = Request.QueryString[<span style="color: #006080">"option"</span>]; |
|
<span style="color: #606060" id="lnum4"> 4:</span>  |
|
<span style="color: #606060" id="lnum5"> 5:</span> <span style="color: #0000ff">if</span> (String.IsNullOrEmpty(option)) |
|
<span style="color: #606060" id="lnum6"> 6:</span> { |
|
<span style="color: #606060" id="lnum7"> 7:</span> option = <span style="color: #006080">"A"</span>; |
|
<span style="color: #606060" id="lnum8"> 8:</span> } |
|
<span style="color: #606060" id="lnum9"> 9:</span>  |
|
<span style="color: #606060" id="lnum10"> 10:</span> String message = String.Format(<span style="color: #006080">"QuestyString option: {1}. Time: {0}"</span>, DateTime.Now, option); |
|
<span style="color: #606060" id="lnum11"> 11:</span> lblInfo.Text = message; |
|
<span style="color: #606060" id="lnum12"> 12:</span> } |
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