lunes, 8 de diciembre de 2014

Simple tip LogParser: obtener todos los usuarios que accedieron a la home page de tu sitio

SELECT DISTINCT cs-username AS Hits FROM 'Folder de tus logs\*log' where cs-uri-stem like '%nombreSiteCollection/SitePages/Inicio.aspx%'

Reemplaza 'Folder de tus logs\*log' con la dirección donde están los logs de tu IIS, y reemplaza nombreSiteCollection con la url del site donde quieres hacer la consulta.

Usa Log Parser Studio para realizar las queries.

https://gallery.technet.microsoft.com/office/Log-Parser-Studio-cd458765

Problemas de versiones al tratar de obtener datos del tenant de Office 365

Al tratar de ejecutar la consola de .NET, me lanzaba el siguiente error al iniciar la app.

image

An unhandled exception of type 'System.Security.VerificationException' occurred in Office365.exe

Additional information: Method Microsoft.SharePoint.Client.ClientRuntimeContext.Load: type argument 'Microsoft.Online.SharePoint.TenantAdministration.SPOSitePropertiesEnumerable' violates the constraint of type parameter 'T'.

Revisando las versiones de las dll, veo que las versiones de Microsoft.SharePoint.Client.Runtime y Microsoft.SharePoint.Client era la 16.0.0.0

image

En cambio la versión de la dll Microsoft.Online.SharePoint.Client.Tenant era la 15.0.4641.1002

image

Para solucionarlo, la mejor manera es utilizar el proyecto https://github.com/OfficeDev/PnP  (Office365 Developer Patterns and Practices) para descargar las dlls correctas.

Cuando bajo el proyecto y los descomprimo, veo que tiene dos carpetas de versiones. Para Office 365 uso la versión 16

image

Recuerda setear en el proyecto, la propiedad “Copy Local” a true para las tres librerías.

image

lunes, 1 de diciembre de 2014

Customize el Public WebSite de Office 365

Cuando compramos una subscripción de Office 365, la misma nos permite crear un sitio llamado “Public Website” (por default crea uno al iniciar la subscripción), el cual permite ser un lugar donde se puede mostrar lo que se  ofrece, información de contacto, etc, todo lo relacionado a información pública. Una de las características de este site es que permite customizar muy facilmente el mismo.

image

image

En la home principal, podemos ver un tab adicional llamado “Sitio”

Ribbon on public website Site tab, showing buttons for Change the Look, Edit Title, and Change Logo

Por ejemplo algunas configuraciones útiles:

  • Ocultar el search box del sitio

image

  • Editar el css de forma interactiva

image

  • Cambiar elementos del sitio (footer, header, etc)

image

image

  • Editar el menu del sitio

image

  • Cambiar el logo

image

  • Cambiar los elementos del sitio

image

image

Para mayor información puede consultar el siguiente link: https://support.office.com/en-us/article/Public-Website-help-for-Office-365-d63eadcf-2642-44ae-93cf-a55642f9d0f7?ui=en-US&rs=en-US&ad=US

sábado, 29 de noviembre de 2014

Agregar/Actualizar un campo Date mediante client object

Supongamos que tenemos una variable llamada submital que es de tipo Date Time. La parte en amarillo es la parte más importanet. Convertitmos la fecha en un formato ISO8601

using (ClientContext clientContext = new ClientContext(urlSharepointList))
{
    clientContext.AuthenticationMode = ClientAuthenticationMode.Default;
    Microsoft.SharePoint.Client.List list = clientContext.Web.Lists.GetByTitle("CRM");
    DateTime NewSubmittal = new DateTime();
    ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();
    ListItem newItem = list.AddItem(itemCreateInfo);
    newItem["Title"] = opportunity.Name;
   newItem["Submital"] = string.Format("{0:0000}-{1:00}-{2:00}T{3:00}:{4:00}:{5:00}Z",
                                        NewSubmittal.Year,
                                        NewSubmittal.Month,
                                        NewSubmittal.Day,
                                        NewSubmittal.Hour,
                                        NewSubmittal.Minute,
                                        NewSubmittal.Second);
   
   
    newItem.Update();
    clientContext.ExecuteQuery();

}

Más post relacionados a ISO8601: http://todosharepoint.blogspot.com.ar/search/label/ISO%208601

martes, 25 de noviembre de 2014

The request uses too many resources–CSOM

Al tratar de insertar un item en una lista de Sharepoint 2013, me lanzaba el error: The request uses too many resources

{Microsoft.SharePoint.Client.ServerException: The request uses too many resources.
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponseStream(Stream responseStream)
   at Microsoft.SharePoint.Client.ClientRequest.ProcessResponse()
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb)
   at Microsoft.SharePoint.Client.ClientRequest.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientRuntimeContext.ExecuteQuery()
   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()

hrresult --> –2146233088

Esto se debe a que Sharepoint setea el número máximo de object-paths que pueden ser usados en un request a 256. Un “Object-Path” trackea cómo un objeto cliente es creado en la clase “ClientRuntimeContext”, de esta manera el objeto puede crearse en el server. Cada SP-Object (por ejemplo un site) genera un object-path-object en el request. Es decir, en palabras simples setea un límite de 256 objetos en una llamada ExecuteQueryAsync.

Para solucionarlo, puedo hacer dos cosas: reducir los object-paths en el request, por ejemplo dividiendo la consulta en consultas más pequeñas o cambiando la propiedad maxObjectPaths.

$webApp = Get-SPWebApplication "htt://ur_webapplication"
$webApp.ClientCallableSettings.MaxObjectPaths = 5000
$webApp.Update()

domingo, 9 de noviembre de 2014

Tip: 5 causas de performance lenta

  • Navegación estructural: por ejemplo si tienes varios sub-sitios (deep navigation), y deseas mostrarlos todos en el menú superior. Es este caso puedes utilizar Managed Navigation para mejorar la performance. Más info en el siguiente link

image

  • Content Rollup: en general son queries muy costosas. Ej: recorrer cada sitio, cada listas y renderizar algo de contenido.

image 

  • Archivos grandes: Ej: tener imágenes grandes o videos, archivos .js gigantes.
  • Tener muchos request: .js, .css e imágenes.
  • Tener muchos web parts en la página:

Simple tip para verificar la performance de nuestro servidor: response headers de la solicitud de una página

Cuando realizamos una solicitud a Sharepoint de una página, en el header de la solicitud de HTTP podemos ver varios datos útiles relacionados a la performance de la plataforma.

Para verificarlas podemos usar las herramientas de desarrollo de IE, fiddler u otra herramienta similar (HTTPWatch). En el IE presionamos F12, y elegimos la sección de Network, y presionamos Play.

image

Realizamos un refresh de la página, y en la solicitud principal, hacemos doble click sobre la misma.

image

image

En los headers de la respuesta tenemos, algunas claves útiles, tales como:

SPRequestDuration: tiene un valor de 2805 milisegundos, lo cual quiere decir que Sharepoint tardo ese tiempo para procesar la solicitud (página) del lado del servidor.  Este header está en cada página de Sharepoint. Tiempos excesivos indican que se hizo mucho trabajo para renderizar la página o el servidor está unhealthy (en español sería “poco sano”). Para verificar si el servidor está unhealthy, Sharepoint también otra header para verificar, “X-SharepointHealthScore”, este tiene un valor entre 0 y 10. 10 es cuando está unhealthy (algún problema) o está sobrecargado (high load y throttling request para mantener ell throughput). Más info en el siguiente link

image

Si este header tiene 0 y tienes alta latencia en el SPRequestDuration, claramente Sharepoint está haciendo mucho trabajo para renderizar la página.

SPIisLatency: es el queue time de la solicitud. Cuando un servidor está sobrecargado, empieza a “encolar” las solicitudes.

miércoles, 5 de noviembre de 2014

Variable de configuración del workflow de aprobación: “CancelonRejection”

La variable “CancelonRejection” define si se cancela el workflow en el PRIMER RECHAZO de una tarea de un workflow.

En un workflow Out the Box, esta configuración se puede hacer desde el mismo UI

image

En cambio cuando se hace un workflow custom con Sharepoint Designer, se tiene que setear la variable mediante la action “Set Variable”

image

Si se revisa la conducta de una tarea en el workflow, encontrarán que al completar una tarea, hay un pequeño IF

image

Cancelation es igual a Yes, se finaliza el proceso de tareas.

image

miércoles, 22 de octubre de 2014

Error al borrar un content type “The content type is in use.”

Al trata de borrar un content type, me lanzaba el error: Sorry, something went wrong, The content type is in use.

image

Para poder eliminar un content type, revisa lo siguiente:

  • Papelera de reciclaje: busca en la papelera (primer y segundo nivel) si hay algún item que tenga relación con el content type.

_layouts/15/AdminRecycleBin.aspx

_layouts/15/AdminRecycleBin.aspx?View=2

  • Listas y Librerías: busca si no hay alguna lista o librería que tenga asociado este content type.

image

sábado, 18 de octubre de 2014

Storage SQL Server capacity planning para Sharepoint 2013

En general para Sharepoint 2010 se usaba la fórmula:

  • Crawl: 0.046 × (sum of content databases)
  • Property: 0.015 × (sum of content databases)

Pero para 2013, no tenemos la base de Property, ahora tenemos 4 bases dedicadas para el servicio de Search:

  • Search Administration: The Search Administration database hosts the Search service application configuration and access control list (ACL) for the crawl component.

  • Analytics Reporting: The Analytics Reporting database stores the results for usage analysis reports and extracts information from the Link database when needed.

  • Crawl: The Crawl database stores the state of the crawled data and the crawl history.

  • Link: The Link database stores the information that is extracted by the content processing component and the click through information.

image

En general se recomienda la siguiente tabla

image

Cómo pueden ver la de analytics depende mucho del uso de la plataforma y la configuración de retención. Por ej: con 14 días de retención, más o menos se llega a los 8 GB de datos.

Es posible limitar en la base de analitycs algunos componentes de Analytics a un tamaño específico. Ej: page request

$SPUsageDefinition = Get-SPUsageDefinition -Identity "Page Requests"
$SPUsageDefinition.MaxTotalSizeInBytes = 12884901888
$SPUsageDefinition.Update()

Links útiles

http://technet.microsoft.com/en-us/library/ff608068(v=office.15).aspx

http://sharepoint2013dbdocs.codeplex.com/

http://technet.microsoft.com/en-us/library/cc298801(v=office.15).aspx

domingo, 28 de septiembre de 2014

Simples comandos para diagnosticar el estado de nuestra distributed cache (diagnostic App Fabric Distributed Cache)

Abro Sharepoint 2013 Management Shell y ejecuto lo siguiente:
image

Get-SPServiceInstance | ? {($_.service.tostring()) -eq "SPDistributedCacheService Name=AppFabricCachingService"} | select Server, Status

El comando anterior, nos permitirá ver las instancias del Servicio DistributedCache, en que servidor están corriendo, y su estado.

image

A continuación ejecuto Use-CacheCluster , el cual nos permite utilizar los comandos específicos de AppFabric. A continuación ejecuto Get-CacheHost, cual nos permitirá ver el estado del servicio de cache en cada host del cluster.

image

En base al comando anterior (hostname:cacheport) ejecuto el siguiente comando.

Get-CacheHostConfig –ComputerName [yourServerName] -CachePort 22233

El mismo nos permite ver la configuración del host especificamente (puertos, tamaño, etc)

image

A continuación ejecuto el siguiente comando:  Get-CacheClusterHealth , el mismo nos permitirá ver las estadísticas de health (salud) de las named cache en el cluster.

image

A continuación ejecutar el siguiente comando: Get-CacheAllowedClientAccounts

El mismo nos permite ver que grupos o usuarios tienen acceso a la cache. Por default deberían estar los grupos WSS_Admin_WPG y WSS_WPG. Si la cuenta que corre el servicio del User Profile no está dentro de estos grupos, tendrán errores inesperados de acceso a la cache.

Para finalizar ejecutar el siguiente comando:

Get-AFCacheHostStatus | % {
    $ServerName = $_.HostName
    Get-AFCacheStatistics -ComputerName $_.HostName -CachePort $_.PortNo | Add-Member -MemberType NoteProperty -Name 'ServerName' -Value $ServerName -PassThru
} | Format-List -Property *

Este comando nos retornará el número de items en la cache, request count, size de la cache, etc.

image

Para finalizar ejecutar los siguientes comandos:

Get-EventLog –LogName System –Source *AppFabric*

Get-EventLog –LogName Application –Source *AppFabric*

Simple tip: Exportar la lista de logs del Event Viewer relacionados a Sharepoint

En una consola de powershell (run as a administrator) ejecuto el siguiente código de powershell:

Get-EventLog –LogName Application –Source *Sharepoint* | Export-Csv c:\LogsApplicationSharepoint.csv

Este comando nos exportará todos lo logs del EventViewer en un archivo .csv

image

image

En el caso que querramos exportar los eventos de la categoría System, simplemente cambiamos el LogName.

Get-EventLog –LogName System –Source *Sharepoint* | Export-Csv c:\LogsSystemSharepoint.csv

sábado, 27 de septiembre de 2014

Donde se instalan las dll´s cuando instalo Sharepoint 2013 Client Component SDK?

Cuando quiero utilizar client object necesito instalar el sdk de client object, el cual puede descargarse del siguiente link:

http://www.microsoft.com/en-in/download/details.aspx?id=35585

El instalador deja las dlls de client object en el siguiente path:

C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI

C:\Program Files\SharePoint Client Components\Assemblies

image

image

domingo, 21 de septiembre de 2014

Crear una estructura de folders mediante un archivo .csv con Client Object Model

Supongamos que tenemos un archivo .csv con el siguiente contenido

image

Todas las carpetas están separadas mediante una coma (,)

El sitio donde se creará esta estructura, tiene la siguiente url: http://sharepointsite.com.

La librería donde se crea la estructura, se llama “Proyectos”

El archivo csv, se encuentra en el siguiente path: E:\TEMP\carpetas.csv

El código para crear la estructura de carpetas es la siguiente:

Code:
using (ClientContext clientContext = new ClientContext("http://sharepointsite.com"))
{
Web web = clientContext.Web;
Microsoft.SharePoint.ClientList docLib = web.Lists.GetByTitle("Proyectos");
var folderRoot = docLib.RootFolder;
clientContext.Load(folderRoot);
clientContext.ExecuteQuery();

using (StreamReader file = new System.IOStreamReader(@"E:\TEMP\carpetas.csv"))
{
while (!file.EndOfStream)
{
string line = file.ReadLine();
string[] listaFolders = line.Split(new Char[] { ',' });
string estructuraFolders = "";

foreach (var folder in listaFolders)
{
estructuraFolders = estructuraFolders + "/" + folder;
}
if (estructuraFolders != "/")
{
Folder NewFolder = EnsureFolder(clientContext, folderRoot, estructuraFolders);
}
}

}
}


 


Y el método EnsureFolder hace lo siguiente:




Code:
public static Folder EnsureFolder(ClientContext ctx, Folder ParentFolder, string FolderPath)
{
string[] PathElements = FolderPath.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
string Head = PathElements[0];
Folder NewFolder = ParentFolder.Folders.Add(Head);
ctx.Load(NewFolder);
ctx.ExecuteQuery();
if (PathElements.Length > 1)
{
string Tail = string.Empty;
for (int i = 1; i < PathElements.Length; i++)
Tail = Tail + "/" + PathElements[i];

return EnsureFolder(ctx, NewFolder, Tail);
}
else
return NewFolder;
}

Cómo utilizar el debugger de Visual Studio con client side rendering

Primero verifico que esté desmarcado las siguientes opciones en las propiedades avanzadas del IE.

image

(function () {
    var itemCtx = {};
    itemCtx.Templates = {};
   
    itemCtx.Templates.Header = "<table>";
    itemCtx.Templates.Footer = "</table>";
    itemCtx.Templates.Fields = { 'Title': { 'View': ItemOverrideFun}};
    itemCtx.BaseViewID = 1;
    itemCtx.ListTemplateType = 101;         
    SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx);
})();

function ItemOverrideFun(ctx) {   
   debugger;
    var title = ctx.CurrentItem.Title;
    var fileRef = ctx.CurrentItem["FileRef"];
    var fileLeafRef = ctx.CurrentItem["FileLeafRef"];  
       var htmlToDeploy = "<a style='color:#000; font-weight:bold' href='" + ctx.CurrentItem["FileRef"] + "'>" + ctx.CurrentItem.Title + "</a><br><span>" + formattedDate(ctx.CurrentItem.Modified)  + " for <b><font color='#f58228'> "+ ctx.CurrentItem.Customer[0].lookupValue +"</font></b></span>";
 
    return htmlToDeploy;
}

En la función ItemOverrideFun, vemos la palabra debugger, esta es una palabra reservada que permite invocar el JIT (just in time) debugger

Al ejecutarse esta línea en el IE, me lanza la siguiente ventana

image

Al abrir el Visual Studio 2013, veo el stack de llamadas y me permite debuggear con VS

image

Si marca la variable htmlToDeploy, y selecciono Add Watch

image

image

Puedo ver el html que se renderiza en la página de forma fácil

image

Si veo en la página como queda,

image

sábado, 20 de septiembre de 2014

Cancelar un workflow de aprobación en el primer reject del workflow

Cuando se usa el portal web, permite elegir si se cancelará el workflow de aprobación en el primer reject del mismo (End on First Rejection)

image

Pero cuando usas Sharepoint Designer, tenés que setear la variable “CancelonChange” a Yes para que se termine el workflow de aprobación en el primer reject del proceso.

Si revisas el workflow de aprobación, puedes ver en la sección “Overral task process”

image

Y en la subsección “Al cambiarse el elemento”, pueden que tiene un IF que finaliza el proceso

image

Para solucionarlo, podemos ejecutar una acción de seteo de una variable del workflow antes del comienzo de aprobación (entonces Estableceer Variable:CancelonChanges como Yes)

Ej:

image