viernes, 14 de diciembre de 2012

The HTTP header ACCEPT is missing or its value is invalid making rest call using JavaScript

Es bastante común que al intentar hacer una llamada utilizando la API REST para SharePoint 2013 utilizando JavaScript, como la siguiente:

function onGetCustomers(){
 var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('Clientes')/items/?$select=Title,Nombre,Apellidos";
 
 //$.getjson() falla
 jqCall = $.getJSON(requestUri,null, onGetCustomersSuccess);
 jqCall.error(onError);
}

Nos encontremos con un error como este:


25d
{"error":{"code":"-1, Microsoft.SharePoint.Client.ClientServiceException","message":{"lang":"en-US","value":"The HTTP header ACCEPT is missing or its value is invalid."},"innererror":{"message":"The HTTP header ACCEPT is missing or its value is invalid.","type":"Microsoft.SharePoint.Client.ClientServiceException","stacktrace":"   at Microsoft.SharePoint.Client.Rest.RestRequestProcessor.Process()\r\n   at Microsoft.SharePoint.Client.Rest.RestRequestProcessor.ProcessRequest()\r\n   at Microsoft.SharePoint.Client.Rest.RestService.ProcessQuery(Stream inputStream, IList`1 pendingDisposableContainer)"}}}
0


Y esto se debe sencillamente a que si inspeccionamos a detalle los headers enviados en la petición  encontraremos que hace falta algo adicional:

Headers enviados como parte del request:


Al hacer este tipo de llamadas debemos indicar, junto con el header Accept=application/json, el header: odata=verbose, es decir quedaría de esta forma:   Accept=application/json; odata=verbose. Esto debido a que por el momento solo se soporta el formato verbose de JSON, el formato "light" no es soportado.

Luego entonces cambiamos la llamada para incluir este header, por el siguiente código:

function onGetCustomers(){
 var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('Clientes')/items/?$select=Title,Nombre,Apellidos";

 var requestHeaders={
 "ACCEPT":"application/json;odata=verbose",
 }

 $.ajax({
 url: requestUri,
 type:"GET",
 contentType:"application/json",
 headers: requestHeaders,
 success:onGetCustomersSuccess,
 error:onError
 });
}

Después de realizar esto, la respuesta sera satisfactoria

Algunas referencias:
Important developer changes from Office and SharePoint 2013 Preview to Office and SharePoint 2013
OData Verbose JSON Format

Happy Coding!

sábado, 8 de diciembre de 2012

Add Sign In as Different User in SharePoint 2013 with custom action

Si ya han estado utilizando SharePoint 2013, por lo menos en ambientes de pruebas, se habrán dado cuenta que en el menú de acciones personales la opción "Sign as Different User" simplemente ya no esta, todos pensábamos que era solo una omisión de la versión beta, pero ahora que se han liberado la versión definitiva, vemos con asombro que sigue sin aparecer.

Nick Grattan muestra en su ejemplo de como agregar esta opcion al menu, sin embargo es necesario mencionar que no es una buena practica (sin tomar en cuenta que no es soportada por Microsoft) modificar los archivos que están en el folder 15, ademas de que en un ambiente multiservidor se deberían modificar al menos todos los WFE's.

Una mejor solución, desde mi particular punto de vista, es crear un custom action que agregue la opción al menú mediante una feature que se despliegue en la granja de SharePoint.

Nuestro Objetivo
Para lo cual, crearemos una solución en blanco de SharePoint 2013, agregando un elemento de tipo "Empty Element"


Y agregamos el siguiente código al archivo Elements.xml que se ha creado

  
            
  


Luego cambiamos el scope de la feature que se creo al agregar el archivo Elements, el scope que debemos establecer es WebApplication para que podamos aprovechar ese elemento en toda la aplicación web


Por último hacemos el deploy de nuestro custom action y ya podremos ver el nuevo elemento del menú que nos permite firmarnos con diferentes usuarios


Para concluir les comparto el código.  


Happy Coding

viernes, 7 de diciembre de 2012

Webcast - CSOM y la API REST para SharePoint 2013

Como parte de la continuación del exitoso maratón de SharePoint que se llevo a cabo el día 29 de Noviembre  y que desafortunadamente tuvo que suspenderse por motivos técnicos.

Quiero invitarlos al webcast que estaré impartiendo el día martes 11 de Diciembre de este 2012.
El horario es 02:00 – 03:00 (GMT +1), es decir (7:00 pm a 8:00 pm hora del centro de México UTC-6:00)

Ademas comparto la lista completa de webcast que se estaran impartiendo.


Espero me puedan acompañar


Entrar al evento


Happy Coding!

viernes, 30 de noviembre de 2012

SharePoint Conference 2012

Pues bien, ha sido un evento fabuloso, bastante bien organizado.

La calidad de profesionales que tuve oportunidad de conocer y las opiniones que compartimos fueron realmente valiosas

Las vegas es una ciudad asombrosa con muchos lugares a donde ir, aunque muy cara. De noche siempre hay algo que hacer

Sin duda un evento que quedara para la historia

Algunas fotos.









domingo, 4 de noviembre de 2012

SharePoint 2010 - New instances of this workflow template are currently disallowed

¿Les ha pasado que alguna vez quieren iniciar una instancia de un flujo de trabajo y aparece este mensaje de error?

Bueno púes a mí me había pasado muchas veces, solo que nunca al utilizar código para iniciar automáticamente un flujo de trabajo, es decir, siempre que había obtenido este mensaje de error había sido utilizando la interfaz de usuario, para lo cual existen muchas referencias en la red para solucionarlo.

SharePoint 2007 - New instances of this workflow template are currently disallowed
Error: New instances of this workflow template are currently disallowed.

¿Pero y cómo podemos resolverlo cuando hablamos de código?

Al igual que cuando lidiamos con este error al intentar inicializar in flujo de trabajo utilizando la interfaz de usuario, este error se debe a que existe más de una versión del mismo flujo relacionada con la lista o cualquier otro elemento al que se pueda asociar un workflow como librerías de documentos, sitios, etc., en mi caso específico con un tipo de contenido.

Para ejemplificar este escenario, muestro a continuación mi código de powershell que tenía este error, y el cual simplemente intentaba iniciar programáticamente todas las instancias de una lista de SharePoint con el estatus de “Cancelled”:

cls
#Add-PSSnapin microsoft.sharepoint.powershell
$siteUrl="http://sp2010/mysite"
$site = Get-SPSite -Identity $siteUrl

foreach($web in $site.AllWebs)
{
    $list=$web.Lists["List"]
    $manager=$site.WorkFlowManager
   
    foreach($ct in $list.ContentTypes)
    {
        if($ct.Name -eq "MyContentType")
        {
            $swapWorkflowAssociation = $Ct.WorkflowAssociations[0]
        }
    }
    
    #Si la referencia al objeto WorkflowAssociation es null, no intentamos iniciar el WF
    if($swapWorkflowAssociation -eq $null) { continue } 
   
    foreach($listItem in $list.Items)
    {
        foreach($workflowInstance in $listItem.Workflows)
        {
        
            if($workflowInstance.InternalState -eq [Microsoft.SharePoint.Workflow.SPWorkflowState]::Cancelled)
            {
               $data=$workflowAssociation.AssociationData
               try
               {
                    $result = $manager.StartWorkflow($listItem, $workflowAssociation, $data, $True)
               }
               catch
               {
                    #Write-Host $_.Exception.ToString()
               }
               
               $cadena =   "Se inicia el WF|" + $web.Url + "|" + $listItem.ID.ToString() + "|" + $listItem.Title + "|" + $workflowInstance.InternalState
               
               Write-Host $cadena 
            }  
        }
    } 
}


Como comente antes, en la línea marcada obtenía este mensaje de error. El error estaba en que debido al proceso de prueba y error desarrollo iterativo, el tipo de contenido tenía más de una versión del flujo de trabajo asociado, por lo que al intentar recuperar una referencia al objeto WorkflowAssociation, no se recuperaba precisamente la más “reciente” o actual. El truco está en que las versiones viejas del flujo de trabajo, además de ser establecidas con el atributo “No New Instances”, siempre son renombradas de la forma: “NombreDeMiWorkflow (fecha)”, excepto para la Asociación más reciente (la correcta).

Por lo que, para evitar este error, se debe validar que la propiedad Name del objeto WorkflowAssociation, sea exactamente como la establecimos en un principio, sin fechas (o algún otro texto adicional).
$swapWorkflowAssociation = $Ct.WorkflowAssociations[0]

Para concluir, el código corregido

cls
Start-SPAssignment –Global
#Add-PSSnapin microsoft.sharepoint.powershell
$siteUrl="http://sp2010/mysite"

$site = Get-SPSite -Identity $siteUrl

foreach($web in $site.AllWebs)
{
    $list=$web.Lists["List"]
    $manager=$site.WorkFlowManager
   
    foreach($ct in $list.ContentTypes)
    {
        if($ct.Name -eq "MyContentType")
        {
            foreach($swapWorkflowAssociation in $Ct.WorkflowAssociations)
            {
                if($swapWorkflowAssociation.Name -eq "MyWorkflowName") 
                {
                    $workflowAssociation = $swapWorkflowAssociation
                }
                
            }
        }
    }
   
   #Si la referencia al objeto WorkflowAssociation es null, no intentamos iniciar el WF
   if($swapWorkflowAssociation -eq $null) { continue } 
   
    foreach($listItem in $list.Items)
    {
        foreach($workflowInstance in $listItem.Workflows)
        {
        
            if($workflowInstance.InternalState -eq [Microsoft.SharePoint.Workflow.SPWorkflowState]::Cancelled)
            {
               $data=$workflowAssociation.AssociationData
               try
               {
                    $result = $manager.StartWorkflow($listItem, $workflowAssociation, $data, $True)
               }
               catch
               {
                    #Write-Host $_.Exception.ToString()
               }
               
               $cadena =   "Se inicia el WF|" + $web.Url + "|" + $listItem.ID.ToString() + "|" + $listItem.Title + "|" + $workflowInstance.InternalState
               
               Write-Host $cadena 
            }  
        }
    } 
}

Happy Coding!

Etiquetas

SharePoint 2010 (38) Microsoft (32) Desarrollo SharePoint (31) Gerardo Reyes Ortiz (27) SharePoint (20) SharePoint 2013 (18) Errores SharePoint (12) México (10) PowerShell (9) Silverlight (8) Visio Services (7) Features (6) MVP (6) Silverlight 3 (6) WebCast (6) Workflows (6) Configuracion SharePoint 2010 (5) D.F. (5) API REST (4) Configuracion SharePoint 2010; (4) Troubleshooting (4) Visual Studio 2010 (4) Visual studio (4) WSS (4) Web parts (4) Apps (3) Comunidad SharePoint (3) Configuración SharePoint 2013 (3) ODATA (3) SharePoint Server (3) SharePoint; Instalación SharePoint; Troubleshooting; Search Service (3) Silverlight 3.0 (3) Silverlight Toolkit (3) WebParts (3) javascript (3) jquery (3) Eventos SharePoint (2) Office 2010 (2) PeoplePicker (2) REST (2) SQL Server (2) Scripting (2) Search Service Application (2) SharePoint Designer (2) UPA (2) UPS (2) Workflows SharePoint (2) host header (2) Apps Development (1) Big Bang (1) CAS (1) CSOM (1) Codeplex (1) CompartiMOSS (1) Configuracion SharePoint 2010; Errores SharePoint (1) Configuracion SharePoint 2010; SharePoint 2010 (1) Custom Actions (1) Custom Editor Parts (1) Delegate Controls (1) Deployment (1) DisableLoopbackCheck (1) Document Library (1) Entrevista (1) Examenes de Certificación (1) Extract WSP (1) FBA (1) FS4SP (1) Fakes (1) Fast Search Server 2010 For SharePoint (1) Fiddler (1) HTTP.SYS (1) HTTPS (1) JSON (1) Language Pack's (1) Latam (1) MAXDOP (1) MCSM (1) MSExpertos (1) MVC (1) Microsoft México (1) Microsoft; Codeplex; Screencast; (1) My Sites (1) SQL Server 2012 (1) SQL Server Reporting Services (1) Screencast (1) Screencast; (1) Service Applications (1) Service Pack (1) SharePoint 2007 (1) SharePoint 2010 SP 1 (1) SharePoint API (1) SharePoint Conference (1) SharePoint Emulators (1) SharePoint Farm (1) SharePoint Health Analyzer (1) SharePoint Magazine (1) SharePoint Online (1) SharePoint Search (1) SharePoint Test (1) SharePoint; Desarrollo SharePoint (1) Shims (1) Simposio (1) Simposio Latinoamericano (1) SkyDrive Pro (1) Soporte Microsoft (1) Templates (1) Tip (1) VSeWSS (1) Virtual Machine (1) Visual Studio 2012 (1) WCF (1) WSS; IIS 7 (1) Web API (1) Web Content Management (1) Web Services (1) Windows 8 (1) Windows Live ID (1) Xml (1) appcmd (1) iOS (1) jqGrid (1) onload function (1)