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.
lunes, 14 de diciembre de 2009
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.
La clase SPDefinitionExporter
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!
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(); } }
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:
Espero que este tip, sea de utilidad
Happy Coding!
Etiquetas:
Desarrollo SharePoint,
Features,
Gerardo Reyes Ortiz,
SharePoint,
Xml
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,
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:
Happy Coding!
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,
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:
///Y con esto al crear el HTML correspondiente a la imagen, el resultado variará dependiendo de la zona en la cual nos encontramos./// 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; }
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!
Etiquetas:
Desarrollo SharePoint,
Gerardo Reyes Ortiz,
México,
SharePoint,
Web parts,
WebParts
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.
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!!!.
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!
Etiquetas:
Desarrollo SharePoint,
Errores SharePoint,
Features,
SharePoint Designer
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.
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.
1.- Descargar el Internet Information Services (IIS) 6.0 Resource Kit Tools e instalarlo.
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:
Recursos:
lunes, 2 de noviembre de 2009
Recursos de mi participación en la 2da semana Académica en el TESSFP
jueves, 22 de octubre de 2009
La cuenta regresiva para Visual Studio 2010
Etiquetas:
Gerardo Reyes Ortiz,
Microsoft,
Visual Studio 2010
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
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!
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:
D.F.,
Gerardo Reyes Ortiz,
México,
Microsoft,
Silverlight 3,
Silverlight 3.0,
Silverlight Toolkit
Suscribirse a:
Entradas (Atom)