Codepoint

by Trentia Consulting

SharePoint 2013 : Evitando el error ‘The Maximum allowed value is 4096’

Recientemente trabajando en el desarrollo de una aplicación web con base de SharePoint 2013, se me ordenó el desarrollo de un centro de búsqueda y de descarga de contenidos en SharePoint, así que me puse manos a la obra.

Esta parte de la aplicación permite al usuario recibir gran cantidad de contenidos por lo que decidimos atacar al servicio de búsqueda de SharePoint 2013 utilizando la librería CSOM 15, dado que las búsquedas sería mucho más optimas y mejoraría la experiencia de usuario. Así mismo existen gran cantidad de filtros que permite al usuario realizar una criba muy especifica de los contenidos que desea recibir. En este proceso se construye una consulta en Keyword Query Languaje (KQL en adelante) dependiendo de los datos que el usuario haya seleccionado en la sección de filtros.

Así pues el código que genera la consulta tiene un aspecto similar a este :

/// <summary>
/// Searches al documents that maches the specified metadata and retrieve all specified properties
/// </summary>
/// <param name="Filters">Filters to add</param>
/// <param name="PropertiesName">Properties to retrieve</param>
/// <returns></returns>
public IEnumerable<IDictionary<string, object>> SearchDocuments(IDictionary<string, object> Filters, IEnumerable<string> PropertiesName)
{
    using (var context = new ClientContext(_host))
    {

        context.AuthenticationMode = ClientAuthenticationMode.FormsAuthentication;
        context.FormsAuthenticationLoginInfo = new FormsAuthenticationLoginInfo(_user, _password);

        KeywordQuery query = new KeywordQuery(context);
        if(PropertiesName != null)
        {
            foreach (var PropertyName in PropertiesName)
            {
                query.SelectProperties.Add(PropertyName);
            }
        }

        query.QueryText = "IsDocument=true";

        if (Filters != null && Filters.Any())
            query.QueryText = query.QueryText + " AND ";

        foreach (var filter in Filters)
        {
            if (filter.Value is Array)
            {
                query.QueryText = query.QueryText + "( ";
                foreach (var valueItem in filter.Value as IEnumerable<object>)
                {
                    query.QueryText = query.QueryText + filter.Key + ":*" + valueItem.ToString() + "*";
                    if (((IEnumerable<object>)filter.Value).Last() != valueItem)
                        query.QueryText = query.QueryText + " OR ";
                    else
                        query.QueryText = query.QueryText + " ) ";
                }
            }
            else
            {
                if (filter.Value is bool)
                {
                    query.QueryText = query.QueryText + filter.Key + "=" + filter.Value.ToString().ToLower();
                }
                else
                {
                    query.QueryText = query.QueryText + filter.Key + ":*" + filter.Value.ToString() + "*";
                }
            }
            if (Filters.Last().Key != filter.Key)
                query.QueryText = query.QueryText + " AND ";
        }

        SearchExecutor executor = new SearchExecutor(context);
        ClientResult<ResultTableCollection> results = executor.ExecuteQuery(query);

        context.ExecuteQuery();
        return results.Value[0].ResultRows;
    }
}

 

Habiendo visto el código que genera las consultas, es fácil imaginar que es posible que la consulta KQL alcance grandes tamaños sobretodo si añadimos que muchos de los valores que se usan en la búsqueda son identificadores globales únicos (GUID por sus siglas en inglés).

Si construimos pues, una consulta excesivamente larga y la lanzamos contra el servicio de búsqueda de SharePoint 2013, recibiremos esta excepción : ( y ningún resultado )

System.ArgumentOutOfRangeException : The Maximum allowed value is 4096, Parameter Name ‘QueryText’

   ¿Por que es lanzada esta excepción ? SharePoint 2013 tiene un limite de caracteres en la búsqueda cuando se usa KQL, este por defecto está establecido en 4096 bytes lo que no permite realizar consultas muy largas o muy complejas. Pero esto tiene solución o por lo menos para la mayoría de los casos, pues este límite se puede incrementar. lo que en la mayoría de casos nos permitirá realizar las consultas que antes no nos permitía el límite de caracteres.

¿ Por que digo que se puede solucionar para la mayoría de los casos ? Pues por que el límite “sólo” se puede incrementar hasta 20480 bytes, lo que en la mayoría de casos nos permitirá realizar las consultas que antes no nos permitía el límite de caracteres. Esta tarea es sencilla pero no se puede realizar desde la administración central de SharePoint 2013 si no que tendremos que establecer el nuevo valor desde la “SharePoint 2013 Management Shell”. El valor que tenemos que modificar es una propiedad llamada MaxKeywordQueryTextLength del servicio de búsqueda. Para realizar eso abriremos como administradores una “SharePoint 2013 Management Shell” e introduciremos los siguientes comandos en la consola :

PS C:\Users\trentia> $search = Get-SPServiceApplication | where {$_.displayname -contains "search"}
PS C:\Users\trentia> $search.MaxKeywordQueryTextLength
4096
PS C:\Users\trentia> $search.MaxKeywordQueryTextLength = 20480
PS C:\Users\trentia> $search.Update()
PS C:\Users\trentia> $search.MaxKeywordQueryTextLength
20480
## Quizás no sea necesario pero cerciorémonos que todo quede intacto
 
PS C:\Users\trentia> Restart-Service spsearchhostcontroller
PS C:\Users\trentia> IISRESET

Y con este sencillo proceso el límite queda incrementado hasta 20 kb lo que nos permitirá realizar consultas muchísimo más complejas.

Espero que sea de ayuda !

Actualización de la URL de alertas en SharePoint

Desde hace varios días estoy realizando una migración cautelosa y paso a paso de un portal complejo en SharePoint al cual se estaba accediendo via protocolo HTTP y al cual se deberá acceder a partir de ahora por HTTPS, o sea, con encriptación SSL. Uno de los usuarios ha detectado un curioso efecto y es que los correos de alerta que le están llegando incluye enlaces a HTTP, cuando en realidad este acceso ya no existe. Por lo visto es un problema bastante común y tiene fácil solución, no solo para este sino para otros escenarios.

He dado con un script de Powershell y algunos articulos muy útiles para reparar estas URLs de alerta de SharePoint. El script en cuestión se llama Invoke-AlertFixup, que como veis tiene un nombre suficientemente explícito. Nos permite indicar la URL base de alertas de las que nos queremos deshacer y sustituirla por la nueva URL o la URL en vigor del portal. En mi caso seria:

> Invoke-AlertFixup –site https://miportal –url http://miportal

Cómo podéis ver estoy realizando el cambio de URLs. El proceso es rápido y efectivo. Os dejo los materiales:

Script de PoweShell en Script Center de MS: Update alerts by using Windows PowerShell

Artículos de Technet sobre el tema:

SharePoint 2013: Cambios en los servicios de búsqueda mediante programación

Después de llevar varios meses trabajando en diferentes proyectos sobre la nueva plataforma SharePoint 2013, creemos que va siendo hora de compartir con vosotros nuestras experiencias.

En el siguiente artículo, vamos a comentar los cambios en los servicios de búsqueda y como afectan a la programación. Como sabréis los servicios de búsqueda FAST se han incorporado al servicio de búsqueda estándar. Esto provoca que los antiguos modelos de programación, como el FullTextSqlQuery, estén marcados como deprecated en la actual versión y por tanto no los podremos utilizar.

En primer lugar, hemos de incoporar a nuestro proyecto las siguientes referencias Microsoft.Office.Server y Microsoft.Office.Server.Search

Con la nueva versión aparece en escena SearchExecutor, que será nuestro objeto principal para la búsqueda.

Utilizaremos el siguiente código para devolver resultados de búsqueda a partir de una o varias condiciones

public static DataTable ExecuteKeyWordSearch(string queryText) 
  { 

  ResultTableCollection rtc = null; 

   DataTable retResults = new DataTable();


   Dictionary queries = new Dictionary(); 

 using (SPSite site = new SPSite(SPContext.Current.Site.ID)) 
   { 

   using (KeywordQuery query = new KeywordQuery(site)) 

   { 

   query.QueryText = queryText; 

   query.KeywordInclusion = KeywordInclusion.AllKeywords; 

   query.RowLimit = 500; 

   query.SelectProperties.Add("Path"); 

    SearchExecutor se = new SearchExecutor(); 

   rtc = se.ExecuteQuery(query);


   if (rtc.Count > 0) 

   { 

   var results = rtc.Filter("TableType", KnownTableTypes.RelevantResults); 

Etiquetas de Technorati:
//results = rtc.Filter("TRENTIAContentType", "CV"); if (results != null && results.Count() >= 1) retResults.Load(results.First(), LoadOption.OverwriteChanges); } } } return retResults; }

 

Con FullTextSqlQuery hacíamos servir una sintaxis similar a SQL para realizar búsquedas e incluir campos a los resultados de la búsqueda. Actualmente esto ya no funciona así. La sintaxis que tendremos que hacer servir a partir de ahora será la siguiente:

En el caso que deseamos filtrar por algún tipo de contenido, le pasaremos por parámetro (queryText) un string con la siguiente sintaxis: ContentType:CV

En fin, espero os sirva de utilidad a la hora de introduciros en el nuevo modelo de búsquedas de SharePoint 2013.

Disponible Service Pack 2 de SharePoint 2010

Ya tenemos disponible el SP2 de SharePoint 2010, centrado en resolver problemas relacionados a seguridad, estabilidad y escalabilidad. También ofrece mejor compatibilidad con Windows 8, Internet Explorer 10, Office 2013 y SharePoint 2013.

Podéis ampliar información en http://blogs.office.com/b/sharepoint/archive/2013/07/23/check-out-the-sharepoint-server-2010-service-pack-2.aspx

Para descargarlo en:

Trentia Consulting presenta las novedades de SharePoint 2013 en Cal Calderón (Viladecans)

sharepoint2013_3Trentia Consulting coorganizó con el centro de innovación de Microsoft para la productividad (www.micproductivity.com) un nuevo seminario sobre las novedades de SharePoint 2013 y de cómo mejorar la productividad empresarial a través de las herramientas empresariales.

Básicamente se presentó una breve descripción de qué es Microsoft SharePoint para pasar posteriormente a ver en más profundidad cuales son las novedades que aporta la nueva versión 2013. Además, antes de finalizar, los asistentes pudieron ver un caso práctico en tiempo real.

En los siguientes enlaces podéis encontrar el material que se presentó:

Desde aquí damos las gracias a todos los asistentes.


Si no pudiste asistir al anterior seminario.… no pierdas esta nueva oportunidad: Seminario Microsoft SharePoint 2013

Aplicación práctica y tendencias para mejorar la iProductividad de las Empresas

2013_logo-sharepoint_2De este modo Trentia Consulting te da la bienvenida a la nueva generación de tecnologías SharePoint. Estamos actualizando nuestros servicios para dar cabida a implantaciones y desarrollos en SharePoint 2013. Ofrecemos a nuestros clientes la posibilidad de implantar ya con la más novedosa plataforma de colaboración del mercado.

Agenda del seminario:

9 MAYO 2013 | 9:00.12:30 | Can Calderon, C/Andorra, 64, 08840 (Viladecans)

09:00 - 09:20 Bienvenida
09:20 - 09:50

La iProductividad en las organizaciones, 12 recomendaciones básicas para mejorarla.
Ramon Costa. MIC Productivity

09:50 - 10:20

Microsoft SharePoint, más allá de una plataforma de colaboración. Un entorno de productividad.
Anna Vilalta Gili. Trentia Consulting

10:20 - 10:40

Microsoft Lync 2013. Demostración práctica para el día a día.
Ramon Costa. MIC Productivity

10:40 - 11:10 Café Relacional
11:10 - 11:40

Microsoft SharePoint 2013. Novedades y principales funcionalidades del entorno.
Xavier Tirado. Trentia Consulting

11:40 - 12:00

Casos prácticos de aplicación de Microsoft SharePoint.
Ruben Claramunt. Trentia Consulting

12:00 - 12:20 Turno abierto de intervenciones
12:20 - 12:30 Clausura

 

Trentia Consulting presenta las novedades de SharePoint 2013 en el Parque Tecnológico del Vallès.

El pasado jueves, día 24 de enero de 2013, Trentia Consulting, coorganizada con el centro de innovación de Microsoft para la productividad (www.micproductivity.com).

La jornada llevada a cabo giró en torno a la plataforma de colaboración, comunicación y productividad Microsoft SharePoint 2013.

Básicamente se presentó una breve descripción de qué es Microsoft SharePoint para pasar posteriormente a ver en más profundidad cuales son las novedades que aporta la nueva versión 2013. Además, antes de finalizar, los asistentes pudieror ver un caso práctico en tiempo real.

En los siguientes enlaces podéis encontrar el material que se presentó:

Agradecemos a todos los asistentes su participación en el acto. Está previsto repetir el seminario en fechas próximas para aquellas personas que no hayan podido asistir.

seminari

SharePoint 2013 App con TypeScript

Tal y como dicen en su página, TypeScript es un lenguaje de programación para hacer escalable el desarrollo con JavaScript.

Últimamente se han creado grandes frameworks de JavaScript (quizás el más conocido sea JQuery) que muestran lo que se puede llegar a hacer con ese lenguaje. Con la aparición de HTML5 la tendencia es usar cada vez más JavaScript, cargando el lado del usuario de más funcionalidad.

TypeScript es un supra-conjunto de JavaScript cuya compilación resulta ser JavaScript plano, es decir, se puede ejecutar en cualquier navegador y sistema operativo, y es Open Source.

Además, se puede usar para desarrollar aplicaciones de SharePoint 2013. Os dejo un link en el que explica paso a paso cómo se configura y se presenta un ejemplo.

Microsoft.SharePoint.SPException: This view requires at least Microsoft Internet Explorer 7.0, Mozilla FireFox 3.0, or Apple Safari 3.0.

Si alguna vez os encontráis con que un portal en SharePoint funciona lentamente e incluso llega a quedarse colgado el primer paso a seguir es echar un vistazo a los logs ULS (unified log system).

Si veis que os aparecen un montón de mensajes como éste:

Microsoft.SharePoint.SPException: This view requires at least Microsoft Internet Explorer 7.0, Mozilla FireFox 3.0, or Apple Safari 3.0.    at Microsoft.SharePoint.WebControls.Gantt.OnLoad(EventArgs e)     at System.Web.UI.Control.LoadRecursive()     at System.Web.UI.Control.AddedControl(Control control, Int32 index)     at Microsoft.SharePoint.WebPartPages.ListViewWebPart.CreateChildControls()     at Microsoft.SharePoint.WebPartPages.WebPartMobileAdapter.CreateChildControls()     at System.Web.UI.Control.EnsureChildControls()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Control.PreRenderRecursiveInternal()     at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Significa que las vistas Gantt de vuestras listas están dando error en los rastreos de la búsqueda.

Para solucionarlo seguid los siguientes pasos:

  1. Abrir RegEdit en el servidor
  2. Ir a HKLM\SOFTWARE\Microsoft\Office Server\14.0\Search\Global\Gathering Manager
  3. Cambiar la clave UserAgent de:
    • Mozilla/4.0 (compatible; MSIE 4.01; Windows NT; MS Search 6.0 Robot)
    • por:
    • Mozilla/4.0 (compatible; MSIE 7.0; Windows NT; MS Search 6.0 Robot)
  4. Finalmente, reinicia los servicios de búsqueda.

Inserción de mapas de Google interactivos en SharePoint 2010

Si queremos insertar el código de un mapa interactivo proporcionado por Google en una página de publicación de SharePoint 2010 nos daremos cuenta que SharePoint no nos deja. Esto es debido a que el código generado por Google contiene un frame.

De todas formas, aquí os dejo una solución para poder insertarlos:

  1. Primero necesitamos el código HTML proporcionado por Google.
  2. 1

  3. Abrimos un bloc de notas (notepad) i pegamos el código allí.
  4. Guardamos el documento .txt en una biblioteca de documentos.
  5. 2[4]
  6. Abrimos el documento y guardamos la url en un sitio para tenerla a mano (ya que la necesitaremos posteriormente).
  7. Vamos a la página en la que queremos insertar el mapa y la editamos. Situamos el cursor donde deseemos y clicamos en las pestañas superiores: Insertar > Elemento web.
    3
  8. En el listado de elementos web elegimos: Medios y contenido > Editor de contenido y lo agregamos.
    4
  9. Una vez hecho esto, veremos que se nos ha agregado un “contenedor” que se muestra de la siguiente manera:
    5
  10. Editamos el elemento web.
    6
  11. En la caja de texto de “Vínculo del contenido” escribimos la url del documento que hemos subido antes.
    7
  12. Guardamos la página y la publicamos. Ya deberíamos ver el mapa en nuestra página.
    8