lunes, 14 de diciembre de 2009

Métodos y tipos marcados como "Deprecated" para SharePoint 2010

Pues simplemente eso, compartir la liga de MSDN en donde se enumeran los métodos y tipos que son/serán marcados como "Deprecated" para la version 2010 de SharePoint y que de entrada deberiamos estar evitando en nuestro código, en aras de hacer menos dolorosa la experiencia de migración (por lo menos en cuanto a desarrollo se refiere).

 Es importante mencionar que los tipos y métodos marcados con el atributo "Obsolete", continuarán funcionando en nuestro código, y solo generarán warnings al momento de compilar, aunque es muy recomendable que sean sustituidos por las nuevas implementaciones.



domingo, 13 de diciembre de 2009

Exportar listas de Sharepoint como Features

Hoy quiero compartir uno de los tips que utilizo muy a menudo cuando desarrollo, el de cómo exportar la definición de una lista cualquiera de SharePoint y construir una Feature para poder provisionarla en otros sitios.

Muchos podrán pensar que podemos hacer lo mismo solo guardando la lista como plantilla y después agregándola al sitio que deseemos, sin embargo, para nosotros los desarrolladores, siempre es mejor tener todo por código, y que al crear nuestro paquete de instalación (WSP), este contenga una Feature que provisione la definición e instancia de la lista, es decir, todo lo necesario para que nuestro desarrollo funcione.

Básicamente esta solución lo que hace es utilizar la API que se encuentra en las dll’s:

VSeWSS.Server.Services.dll
VSeWSS.Server.SPProxies.dll

Pasos a seguir para provisionar la definición e instancia de nuestra lista a través de una feature.

1.- El código que nos permite extraer la definición de una lista

El código principalmente utiliza la funcionalidad que ya existe en la clase SPService del ensamblado VSeWSS.Server.Services, que es instalado junto con las extensiones de Visual Studio 2008 para Windows SharePoint Services 3.0, si tu instalación fue hecha en la ruta por default, estos ensamblados se encuentran en C:\Program Files\Microsoft SharePoint Developer Tools 9.0\svc\bin.

El método ExportListDefinition, que es el que se encarga de extraer la definición de la lista en cuestión, hace uso del método GetListTemplateFileExport de la clase SPService, el cual regresa un objeto del tipo ExportFilesResponse, el cual posteriormente es utilizado como parametro en el llamado al metodo SaveAsFile de la clase SPDefinitionExporter, pero que mejor que ver el código para aclarar cualquier duda.

/// <summary>
/// Exporta la lista indicada hacia el directorio de salida
/// </summary>
/// <param name="outputdir" />
/// <param name="url" />
/// <param name="listname" />
private static void ExportListDefinition(string outputdir, string url, string listname)
{
 SPSite site = null;
 SPWeb web = null;
 try
 {
  using (site = new SPSite(url))
  {
   using (web = site.OpenWeb())
   {
    Guid g = web.Lists[listname].ID;
    SPService service = new SPService();
    ExportFilesResponse response = service.GetListTemplateFileExport(url, g);
    if (response.IfSuccess)
    {
     if (response.Entity != null)
     {
      SPDefinitionExporter exporter = new SPDefinitionExporter(outputdir, url);
      exporter.SaveAsFile(response.Entity);
     }
    }
   }
  }
 }
 catch (Exception ex)
 {
  if (web != null) web.Dispose();
  if (site != null) site.Dispose();
  throw ex;
 }
}

La clase SPDefinitionExporter

internal class SPDefinitionExporter
{
 public string ExportLocation
 {
  get;
  set;
 }

 public virtual string TargetSiteUrl
 {
  get;
  set;
 }
 // Methods

 public SPDefinitionExporter(string exportLocation, string targetSiteUrl)
 {
  this.ExportLocation = exportLocation;
  this.TargetSiteUrl = targetSiteUrl;
 }


 public void SaveAsFile(ExportFileEntity file)
 {
  if (file != null)
  {
   string path = string.Format("{0}{1}", this.ExportLocation, file.RelativePath);
   Directory.CreateDirectory(GetParentDirectoryPath(path));
   if (file.IsText)
   {
    SaveAsFile(file.ContentStr, path);
   }
   else
   {
    SaveAsFile(file.ContentBin, path);
   }
  }
 }

 public void SaveAsFile(IEnumerable<ExportFileEntity> files)
 {
  if (files != null)
  {
   foreach (ExportFileEntity entity in files)
   {
    this.SaveAsFile(entity);
   }
  }
 }

 private static void SaveAsFile(string contents, string path)
 {
  FileStream stream = File.Create(path);
  StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
  writer.Write(contents);
  writer.Flush();
  writer.Close();
  stream.Close();
 }
 private static string GetParentDirectoryPath(string path)
 {
  if (string.IsNullOrEmpty(path))
  {
   return string.Empty;
  }
  int length = path.LastIndexOf(@"\");
  return path.Substring(0, length);
 }

 private static void SaveAsFile(byte[] contents, string path)
 {
  FileStream output = File.Create(path);
  BinaryWriter writer = new BinaryWriter(output);
  writer.Write(contents);
  writer.Flush();
  writer.Close();
  output.Close();
 }
}
Para fines didacticos he creado una lista llamada Empleados, la cual servira para demostrar como extraer su definición y despues crear la feature que provisionara la definición obtenida, así como una instancia de la lista. La lista tiene la siguiente estructura:



Corriendo este programita con los siguientes argumentos

ExportListDefinition.exe -url http://siber:81 -path "c:\temp" -listname Empleados
 




2.- Creando la feature

Una vez que ya tenemos los archivos obtenidos de la utilería que exporta la definición de la lista, es tiempo de crear la feature que provisionara estos archivos en un sitio de SharePoint, para esto recomiendo utilizar algún asistente como VSeWSS 1.3, WSPBuilder, etc.

Yo utilizo WSPBuilder simplemente porque estoy más familiarizado con él, y su uso me parece mas intuitivo.

Entonces creamos la solución, agregamos una nueva feature, y creamos una jerarquía de archivos como la siguiente:











3.- Archivos complementarios

Por default al crear la feature, el asistente nos creara un archivo elements.xml, el cual renombraremos como Instance.xml, y cuya estructura es la siguiente:




También, debemos colocar el archivo ListDefinition.xml, que la utilería creó, al mismo nivel que el archivo Feature.xml y el archivo Instance.xml, a continuación como se ve el archivo Instance.xml de mi ejemplo:



Noten que he resaltado el Id de estos dos elementos, y esto es porque este Id debe ser el mismo, y debe corresponder también con el que se encuentra en el archivo schema.xml, como se aprecia a continuación:


Y ya por último, en el archivo Feature.xml debemos hacer referencia a estos 3 archivos que acabo de mencionar, en la sección ElementManifest, como se muestra a continuación:




Una vez que hagamos todo esto y despleguemos nuestra solución (WSP), en la granja de SharePoint, activamos la Feature que hemos creado. 






Y ahora en el sitio en que activamos la feature tenemos una instancia de la lista de empleados:



Pero además podemos crear una lista con el mismo template, ya que también provisionamos la lista como plantilla:









Además dejo el código, para que lo revisen.

Espero que este tip, sea de utilidad

Happy Coding!

lunes, 7 de diciembre de 2009

[SharePoint] - Obtener la url de un recurso desde la zona correcta

Alguien había oído hablar del método SPUtility.AlternateServerUrlFromHttpRequestUrl?

Pues básicamente este método nos permite hacer un mapeo de un recurso entre distintas zonas, y nos devuelve la url del recurso en la zona correcta.

A continuación un ejemplo de donde podría ser útil este método, cabe mencionar que estoy acomodando el escenario de tal manera de que se puede notar la funcionalidad de este método.

Por poner un escenario básico, el siguiente:

Tenemos una web application con la url http://intranet.corp.com, que ha sido extendida a la zona de extranet en la url http://extranet.corp.com, para tener un método de autentificación distinto.

Y tenemos una lista con un campo de tipo Imagen, estos campos almacenan rutas absolutas, por lo que cuando se guarde en este campo con una imagen desde la intranet, la ruta que almacenara será más o menos así:

http://intranet.corp.com/PublishingImages/Image1.jpg

Cuando nosotros leamos la lista y construyamos nuestro HTML para que muestre la imagen en una webpart,

Image
Existen dos escenarios posibles:

Si el usuario esta accediendo desde la zona de intranet todo irá bien, sin embargo, si el usuario ha accedido desde la zona de Extranet, se pintara el mismo HTML, porque la url se está leyendo directamente de la lista. Y cuando esto suceda, al usuario se le solicitaran las credenciales pertinentes para obtener acceso al recurso, porque este se encuentra en una zona diferente.

A fin de solucionar este escenario hipotético podemos utilizar el método SPUtility.AlternateServerUrlFromHttpRequestUrl, el cual nos permite transformar esta url por la url correcta dependiendo de la zona en que nos encontremos. Como se aprecia en el fragmento de código siguiente:

/// 
/// Recuperacion de la lista
/// 
/// 
private SPList GetList()
{
 SPList listImages = null;
 using (SPSite site = new SPSite ("http://intranet.corp.com"))
 {
  using (SPWeb web = site.OpenWeb())
  {
   listImages = web.Lists["PublishingImages"];

   for (int index = 0; index < listImages.Items.Count; index++)
   {
    //url de la imagen, extraida directamente desde la lista
    string urlImage = listImages.Items[index]["Thumbnail"].ToString();
    string correctUrl = string.Empty;
    //obtenemos solo la url, sin el nombre de la imagen
    if (urlImage.Contains(","))
    {
     urlImage = urlImage.Split(",".ToCharArray())[0];
    }

    if (Uri.IsWellFormedUriString(urlImage, UriKind.RelativeOrAbsolute) == true)
    {
     Uri uriImage = new Uri(urlImage);
     correctUrl = SPUtility.AlternateServerUrlFromHttpRequestUrl(uriImage).ToString();
    }

    listImages.Items[index]["Thumbnail"] = correctUrl;
   }
  }
 }
 return listImages;
}
Y con esto al crear el HTML correspondiente a la imagen, el resultado variará dependiendo de la zona en la cual nos encontramos.
Image
Image 
Otros posibles escenarios de uso podrían ser al customizar las búsquedas, al obtener los resultados de estas, las urls de los resultados vendrán con la url de la zona default, pero con el método mencionado podemos solucionar este problema SPUtility.AlternateServerUrlFromHttpRequestUrl Method


Happy Coding!

sábado, 28 de noviembre de 2009

[Webcast] - Habilitar el uso de Silverlight en SharePoint

Hola, el día de hoy quiero compartir con la comunidad, un pequeño video que grabe en dias pasados en el que describo de manera breve, los pasos necesarios para configurar el uso de Silverlight en la plataforma SharePoint.

Cabe mencionar que si alguien, tiene alguna duda o sugerencia para nuevos temas de Webcast dejen sus comentarios, ya que mediante estos me estaré basando para futuras entregas.



viernes, 27 de noviembre de 2009

SharePoint Designer no permite el acceso a ningún sitio

Hace poco me disponía alegremente a utilizar SharePoint Designer 2007, cuando al intentar abrir cualquier sitio me desplegaba un mensaje de error indicándome que no contaba con los permisos suficientes, y me sugería pedir más permisos al administrador del sitio web.




En primer instancia me preocupe por algún posible problema de bipolaridad ó personalidades múltiples, ya que yo soy el administrador de la granja!!!.



Pero después de analizarlo con un cappuccino, me hice a la idea de que esto tenía que deberse a alguna ultima modificación ó configuración hecha sobre la granja en los últimos dias. Afortunadamente el proceso de eliminación fue fácil, un dia antes había descargado e instalado la feature 3.5 Web.Config, que se encuentra disponible dentro de todo un conjunto de features para SharePoint 2007 disponibles en codeplex.


Analizando un poco las modificaciones hechas en el web.config, a partir de la instalación de esta feature, me dí cuenta de algo ilógico.

<httphandlers>
 <remove path="*" verb="GET,HEAD,POST"/>
 <add path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" verb="GET,HEAD,POST">
 <add path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" verb="OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY,GETLIB,PROPPATCH,MKCOL,DELETE,(GETSOURCE),(HEADSOURCE),(POSTSOURCE)">
 <add path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" verb="*">
 <add path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="*">
 <add path="*_AppService.axd" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="*">
 <add path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="GET,HEAD">
 <remove path="*.asmx" verb="*"/> 
</httphandlers>


Y es que como se puede observar, al final de la declaración  de los httphandlers, se agrega una declaración removiendo a todos los manejadores para archivos .asmx, go tha hell asmx files!. Como todos sabemos, SharePoint Designer hacen uso extensivo de los web services expuestos por SharePoint, pero como sus manejadores son removidos por la feature, al momento de solicitar el acceso para un usuario a través del servicio /_vti_bin/usergroup.asmx, este devuelve un error 401.

La solución rápida es muy simple, modificar el archivo web.config y colocar la línea siguiente al principio del bloque de httphandlers
<remove path="*.asmx" verb="*"/> 
Asi:
<httphandlers>
 <remove path="*" verb="GET,HEAD,POST"/>
 <remove path="*.asmx" verb="*"/> 
 <add path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" verb="GET,HEAD,POST">
 <add path="*" type="Microsoft.SharePoint.ApplicationRuntime.SPHttpHandler, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" verb="OPTIONS,PROPFIND,PUT,LOCK,UNLOCK,MOVE,COPY,GETLIB,PROPPATCH,MKCOL,DELETE,(GETSOURCE),(HEADSOURCE),(POSTSOURCE)">
 <add path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" verb="*">
 <add path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="*">
 <add path="*_AppService.axd" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="*">
 <add path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" verb="GET,HEAD">
</httphandlers>
La mejor solución es modificar el código de la feature, para que en usos posteriores ya no se presente este error. Para solucionar este error solo tienen que seguir estas instrucciones, para modificar la clase \Features_Project\3.5.Config\FeatureReceiver_35_SL.cs

//**********************************
// Modified Here in order to fix a bug where the "remove" tag was being added to the end of the section.
// From: "configuration/system.web/httpHandlers",
// To: "/configuration/system.web/httpHandlers",

// It turns out that the MS implementation of the webconfig modification class puts mods into an alphabetically sorted list (one for each type)
// and ignores the Sequence number.
// (Actually it's not ignored but seems to be used to determine a winner in case of a modification naming collision.)
// The sorting is done on the full string of (path + "/" + name)
// What this means for us is that as long as the "/" character sorts in front of the "a" character then this hack will cause the implementation to 
// add our modification after before the following "add" modifications.
AddNodeValue(
"remove[@path='*.asmx']",
"/configuration/system.web/httpHandlers",
@"<remove *.asmx="" *="" path="" verb=""> "</remove>
);
//***********************************


Happy Coding!

martes, 24 de noviembre de 2009

La búsqueda de personas no funciona en SharePoint

Si alguna vez les ha pasado que en sus sitios de sharepoint las búsquedas de personas no funcionan. Es decir las búsquedas de contenido en el sitio funcionan correctamente pero no así la de personas, esto es muy fácil de solucionar.

Solo vayan al sitio central de administración -> sitio de administración del SSP -> Search Settings -> Content Sources and Crawl Schedules. Editen el source que contiene el sitio que no devuelve resultados en las búsquedas de personas y agreguen otra entrada con la url de su sitio sustituyendo el protocolo por sps3.
Asi:
http://mysite:8080
sps3://mysite:8080

Además les dejo un pequeño screencast en el que se aprecia mejor esto.




martes, 3 de noviembre de 2009

Authentication failed because the remote party has closed the transport stream

Hace poco en una implementación más, de mi producto favorito: vodka con jugo de piña MOSS 2007, me tope con un error al momento de intentar acceder a la página de configuración de búsquedas que se encuentra dentro de la web application Admin del SSP (Shared Services Provider) http://myserver:11300/ssp/admin/_layouts/searchsettings.aspx.


El error decía algo más o menos así:


Could not connect to server “SERVER_NAME” for application 'SSP'. This error might occur if the server is not responding to client requests, the firewall or proxy configuration is preventing the server from being contacted, or the search administration Web service is not running on the server.


Inmediatamente después intente accede a la página de administración de búsquedas: http://myserver:11300/ssp/admin/searchadministration.aspx., para ver si por ahí podía arreglar este problema, pero aquí surgió otro mensaje de error OMFG!:


Authentication failed because the remote party has closed the transport stream.


Al revisar los logs de SharePoint, me di cuenta que el servidor1 no se podía comunicar con el webservice del servicio de búsqueda del servidor2. Ya que este le denegaba el acceso a la url:


https://server2:56738/SharedServicesProvider1/Search/SearchAdmin.asmx.


Después de maldecir buscar un rato en la red, me encontré que este es un issue conocido por Microsoft y es documentado por el kb “You cannot browse to an SSL-secured Office SharePoint Server 2007 site or to the Search Settings page for a Shared Services Provider”.


Y es provocado por el .Net Framework 3.5 SP 1, que hace que los certificados auto firmados (“self signed”), sean corruptos o no sean de confianza. Sin embargo la solución es sencilla, a continuación los pasos de manera resumida de los que se debe hacer en cada uno de los servidores.












2.- Parar el servicio de busqueda con el commando net stop osearch.



3.- En cada uno de los servidores de la granja de SharePoint ejecutar el comando selfssl /s:951338967 /v:1000, utilizando la utilería selfssl que acabamos de instalar. El directorio de default de instalación es: “c :\Program Files\IIS Resources\SelfSSL”

Parametros:

/s: 951338967. El valor 951338967, se refiere al Id de los servicios web de Office Server, para servidores de 64 bits. Si tu servidor es de 32 bits, el id que debes usar es el 1720207907
/v:1000. Número de días por los que el certificado será válido, Aquí puedes usar un numero mas grande, si así lo deseas.

4.- Por último, pero no menos imprtante, reiniciar el servicio de busqueda, con el comando net start osearch




Recursos:

lunes, 2 de noviembre de 2009

Recursos de mi participación en la 2da semana Académica en el TESSFP

Como había prometido, dejo la presentación que realice en pasados días en el TESSFP. Gracias por la invitación a participar en este evento académico, en donde hubo grandes expositores y grandes platicas para los alumnos.

Fue una experiencia enriquecedora.

Espero verlos pronto de nuevo.














jueves, 22 de octubre de 2009

La cuenta regresiva para Visual Studio 2010

Es oficial, Visual Studio 2010 saldrá a la luz el 22 de Marzo del 2010, la cuenta regresiva ha comenzado, ahora que el beta 2 ha sido liberado para todos nosotros los pobres diablos no subscriptores de MSDN.



Habilitar Assembly Caching en Silverlight 3

Una de las muchas nuevas caracteristicas de Silverlight 3, es la posibildad de habilitar la caracteristica Assembly Caching, la cual nos permite indicarle al navegador que cargue los ensamblados que nuesta aplicación necesita (archivo .xap) bajo demanda y no todos al cargar la página, como funcionaba en la versión 2.0.

Para lograr esto, solo debe seleccionarse la opción “Reduce XAP size by using appication library caching”, en el apartado de propiedades de nuestro proyecto Silverlight. También debemos notar como ahora se crean archivos con extensión.zip para cada uno de los ensamblados que la aplicación ocupa y que serán descargados bajo demanda.  Como se puede observar a continuación:



Cuando la opción no es seleccionada, el archivo resultante xap, es más grande que cuando la opción es seleccionada. Como se puede ver en las siguientes imágenes comparativas.

Opción NO habilitada






Opción habilitada






Pongamos especial atención en el archivo AppManifest.xaml y la sección Deployment.ExternalPart, en la cual se indica cuales son los ensamblados que nuestra aplicación referencia y que serán descargados cuando así se requiera, estos son los ensamblados “cacheados”. Sin embargo noten que hay algunos ensamblados que no son marcados para ser cacheados, como: CachedAssembly.dll o los ensamblados del silverlight toolkit.

Para que esto suceda se debe crear el archivo XXXX.extmap.xml. Y después de crearlo recompilar el proyecto, y automáticamente se creara el archivo XXXX.zip, el cual será copiado a la carpeta ClientBin de la aplicación ASP.Net.  Para facilitar un poco esto, puedes ocupar la utilería Emm, la cual crea automáticamente el archivo XXXX.extmap.xml a partir de tu ensamblado ejecutando un comando como el siguiente:



Nota, para el correcto funcionamiento de esta utilería, el ensamblado debe tener un SN (strong name)



Además también se puede usar para los ensamblados del Silverlight Toolkit, de esta forma solo se descargaría en primera instancia nuestro ensamblado y todos los demás ensambados seria descargados “on demand”. Ejemplo:







En resumen, esta característica es muy poderosa para el mejor desempeño de tus aplicaciones silverlight.

Descargar solución de Ejemplo

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)