La página Storage Metrics (/_layouts/storman.aspx) fué recuperada en SharePoint 2010 SP1 para ofrecer una vista granular del contenido de una colección de sitios respecto a tamaños y porcentajes de utilización. La manera de recolectar y mostrar esos datos fue optimizada: un job timer “Storage Metrics Processing” (ejecutado por defecto cada 5 minutos) calcula los datos para que después puedan ser directamente presentados en la página.
Y te preguntarás, y con motivo, ¿Y si yo quiero explotar estos datos programáticamente? El caso más directo es querer controlar el tamaño de un subsitio para de alguna manera monitorizarlo o generar alertas sobre él. Es decir, simular subsite quotas, esa funcionalidad tan anhelada y de la que el equipo de SharePoint se reitera en privarnos de ella.
Bien, aunque el modelo de objetos no ofrece un método directo para obtener esa información (el único método parecido es SPSite.StorageManagementInformation, pero fue declarado obsoleto por ineficiente), podemos echar un vistazo al código fuente de la página y veremos como el truquillo de los desarrolladores de Microsoft es usar un método internal SPSite.GetStorageMetrics. Con lo cual deberemos recurrir a Reflection, pasándonos por el forro el contrato de la API que ofrece la plaforma, pero consiguiendo lo que queremos, al fin y al cabo. ¿Es una mala decisión? Depende del uso que le demos y de si asumimos las consecuencias de ello.
Un código como el siguiente nos servirá para obtener una tabla de elementos (retornada con el tipo interno SPStorageMetricsResult) que representa la información mostrada en la página “Storage Metrics”. De ahí solo tendremos que acceder a los elementos y recuperar su propiedad TotalSize.
using (var site = new SPSite("http://server"))
{
const BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
var methodInfo = typeof(SPSite).GetMethod("GetStorageMetrics", bindingFlags);
var type = Enum.ToObject(typeof(SPSite).Assembly.
GetType("Microsoft.SharePoint.SPSite+StorageMetricsOrderByColumn"), 0);
var result = methodInfo.Invoke(site, new [] { string.Empty, type, false });
}
0 comentarios:
Publicar un comentario