Mostrando entradas con la etiqueta D.F.. Mostrar todas las entradas
Mostrando entradas con la etiqueta D.F.. Mostrar todas las entradas

domingo, 10 de enero de 2010

Exception from HRESULT: 0x81070201

Este error suele suceder cuando estamos provisionando "Instancias de Listas" (ListInstance.xml), a partir de una definición previamente provisionada (ListTemplate.xml).

Básicamente existen dos posibilidades que pudieran ocasionar obtener este bonito error en SharePoint, las cuales son:



  1. Al momento de la activación de la feature (feature1.xml) que provisiona la instancia de la Lista, no se encuentra el archivo schema.xml, es decir, no encuentra la definición a partir de la cual creará la lista. Luego entonces, debemos asegurarnos de que el archivo schema.xml, sea correctamente provisionado y en la ruta correcta. Asegurense de incluir el archivo schema.xml utilizando el elemento <ElementFile/>
  2. Cometimos un error al momento de asignar el atributo Name del elemento ListTemplate, en el archivo ListDefinition.xml. Recuerden que este atributo debe establecerse con el mismo nombre que el del folder en donde se encuentra el archivo schema.xml (sin espacios).




Happy coding!

jueves, 22 de octubre de 2009

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!

viernes, 2 de octubre de 2009

Establecer el host-header de una web application con https binding en IIS 7

Expondré un escenario que nos ocurrió hace poco en una implementación de SharePoint:

Creamos una nueva SharePoint web application, de la forma que ya conocemos, esta web application llamada SecureWebApplication, usara ssl y vivirá en el puerto 80, por lo que la url que da de la siguiente forma: https://securewebaaplication. Al crear esta web application le asignamos un host header, ya que conocemos previamente de la existencia de otra aplicación que se está ejecutando en este puerto.
Después de que la creación de la web application y site collection se llevaron a cabo satisfactoriamente, nos percatamos que la web application no responde, vamos al IIS y encontramos con que el sitio está detenido, intentamos iniciarlo, pero aparece un mensaje indicándonos que existe otro sitio que se encuentra utilizando el mismo puerto.




Efectivamente, existen otros sitios que se encuentra en el puerto 80, pero con host-headers diferentes, entonces, ¿por qué no puede iniciar nuestro sitio web?


Un poco de aburrida teoría…

Existen tres datos que definen la unicidad de un sitio web, los cuales son:

  • Dirección IP
  • Puerto
  • Host name (host-header)
A la suma de estos tres datos se le conoce como binding,  y define a un sitio web que escucha en una ip:puerto con un host-header especifico.

Cuando se recibe una petición, el componente HTTP.sys lee las propiedades de  configuración del sitio al cual se hace la petición, tales como: tiempo de timeout, limite de conexiones y el certificado que utiliza el sitio

Pero para saber a qué sitio se está haciendo la petición, HTTP.sys utiliza el binding (los tres componentes arriba mencionados),  recordemos que el certificado es necesario para desencriptar los datos encriptados que el cliente envía (en donde viene el host-header)

O sea, que tenemos una dependencia circular. Por una parte necesitamos el certificado para desencriptar la información enviada y de ahí recuperar el binding para a su vez poder leer las propiedades de configuración. Y por otro lado necesitamos primero leer las propiedades de configuración para obtener el certificado y así desencriptar la información que viene del cliente. WTF!

En IIS 7, cuando nosotros creamos un binding https en un sitio web,  este automáticamente deshabilita el que nosotros podamos escribir el host-header, porque el host-header esta embebido en el certificado





 






Y después de toda esta reseña, la solución a esto es una pequeña utilería que se encuentra en la carpeta %windir%\system32\inetsrv, llamada appcmd, con la cual podemos forzar a que el host-header del https binding sea establecido. Con algo más o menos asi:



appcmd.exe set site /site.name:securewebaaplication /bindings.[protocol='https',bindingInformation='*:443:'].bindingInformation:*:443:securewebaaplication

Y el resultado final













Pueden revisar este enlace, para mas detalles.

lunes, 21 de septiembre de 2009

Creando Editor Parts personalizados para webparts de SharePoint utilizando Silverlight

Hoy mostraré un ejemplo de cómo escribir un Custom Editor Part para una webpart de SharePoint, en realidad esto no tiene mucha ciencia si no es por el hecho de que utilizaré Silverlight(como siempre) para crear Editor Parts, con una experiencia rica al usuario final.


Creación de la webpart
Primero crearé una simple webpart, llamada SampleWebPart,  con un control Label, que tendrá el valor del color actual del fondo en formato hexadecimal.




Para crear un custom Editor Part los pasos a seguir son los siguientes:


Crear una clase que herede de EditorPart, que se encuentra definido dentro del namespace System.Web.UI.WebControls.WebParts, para este ejemplo crearé una clase llamada ColorEditor, que servirá para editar la propiedad BackColor de SampleWebPart. BackColor es una propiedad que sobrescribiré, ya que esta es una propiedad heredada, y solo le estoy agregando el custom Editor Part. A Continuación el código de la clase ColorEditor.cs:


using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Web.UI.SilverlightControls;

namespace Blog.Webparts.WebPartCode
{
    public class ColorEditor : EditorPart
    {
        HiddenField hiddenField;
        public override bool ApplyChanges()
        {
            this.EnsureChildControls();
            SampleWebpart s = (SampleWebpart)this.WebPartToEdit;
            
            //obtenemos el valor del hidden control
            string strcolor = hiddenField.Value;
            Color c = Color.Transparent.FromHex(strcolor);
            s.BackColor = c;
            return true;
        }

        public override void SyncChanges()
        {
            this.EnsureChildControls();
            SampleWebpart s = (SampleWebpart)this.WebPartToEdit;
            Color c = s.BackColor;
            hiddenField.Value = c.ToHex();
        }

        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            try
            {
                hiddenField = new HiddenField();
                hiddenField.ID = "hfcolorPicker";
                base.Controls.Add(hiddenField);

                Silverlight slControl = new Silverlight();
                slControl.ID = "slColorPicker";
                slControl.InitParameters = "controlid=" + hiddenField.ClientID;
                slControl.Source = "/ClientBin/ColorPickerEditor.xap";
                slControl.Width = 300;
                slControl.Height = 250;
                slControl.MinimumVersion = "2.0.31005.0";
                slControl.Windowless = true;
                base.Controls.Add(slControl);
            }
            catch(Exception ex)
            {
            }
        }
    }
}


En esencia, la creación de un custom editor part, es muy parecida a la creación de una webpart, ya que podemos sobreescribir el método CreateChildControls para agregar los controles que conformarán el editor. Pero además, se heredan dos métodos abstractos que deben ser implementados, SyncChanges y ApplyChanges etc


El método SyncChanges
Este método, tomara los valores actuales de la webpart y los establecera a los controles de el custom editor. Cuando se carga el custom editor, este método es el primero que se ejecuta, no el OnLoad, ni el CreateChildControls (por eso se debe hacer una llamada a EnsurechildControls al inicio de este método)


El método ApplyChanges
Este método se encargara de reflejar los valores establecidos en el custom editor a nuestra webpart target.
Para hacer referencia a la webpart de la cual estamos leyendo/escribiendo valores, lo hacemos mediante la propiedad WebPartToEdit.


El método CreateChildControls
Es en este método donde se crean los controles que conformarán la interfaz del custom editor part, como se observa en el siguiente snippet, he instanciado un objeto de la clase Silverlight, que se encuentra en el namespace System.Web.UI.SilverlightControls,  que es la que nos permite renderear objetos silverlight en el cliente, solo estableciendo unas cuantas propiedades. Además he agregado un control HiddenField, que utilizaré como medio de comunicación entre el código silverlight y la clase ColorEditor.cs
El control ColorPicker es totalmente una creación de Matthias Shapiro, de su post Final-ish  Silverlight Color  Picker Utility, y que muy amablemente puso a disposición de la comunidad. Many thanks Matthias!. Yo solo he modificado la página contenedora de este control, para que acepte como parámetro el id del hidden field y así guardar el valor del color establecido a través del color picker.



Sobrescribir el método CreateEditorParts dentro de la clase SampleWebPart, lo anterior, para instruir a WSS a que cargue nuestro custom editor part además de los Editor Parts estándar que son normalmente desplegados en el Tool Panel. En esta parte utilizamos colecciones de tipo EditorPartCollection. Como se observa en el código siguiente,  debemos agregar todos los custom editor parts a la colección de la clase base para crear una nueva instancia de EditorPartCollection.
Es importante establecer la propiedad ID del los objetos de tipo EditorPart, de lo contrario obtendremos errores al intentar ejecutar nuestro código.


public override EditorPartCollection CreateEditorParts()
{
 List<Editorpart> editor = new List<Editorpart>();
 EditorPart ep = new Blog.Webparts.WebPartCode.ColorEditor();
 ep.ID = this.ID + "_ColorEditor";
 editor.Add(ep);
 EditorPartCollection baseEditors = base.CreateEditorParts();
 return new EditorPartCollection(baseEditors, editor );
}


Al final podremos observar como la experiencia de usuario se ve bastante enriquecida al usar tecnologías como Silverlight.







Por último, el codigo completo de la clase SampleWebPart
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.WebControls;
using System.Drawing;
using System.ComponentModel;
using System.Drawing.Design;
using Blog.Webparts.WebPartCode;

namespace Blog.Webparts
{
    [Guid("057b92f2-193e-4ac4-ba28-bf06e6180aa2")]
    public class SampleWebpart : Microsoft.SharePoint.WebPartPages.WebPart, IWebEditable
    {
        private bool _error = false;
        Label lbl1;

        [Personalizable(PersonalizationScope.Shared)]
        [WebBrowsable(false)]
        [WebDisplayName("Color de fondo")]
        [WebDescription("Color de fondo")]
        [DefaultValue(typeof(Color), "Red")]
        public override Color BackColor
        {
            get
            {
                return base.BackColor;
            }
            set
            {
                base.BackColor = value;
            }
        }
        public SampleWebpart()
        {
            this.ExportMode = WebPartExportMode.All;
        }

        /// 
        /// Create all your controls here for rendering.
        /// Try to avoid using the RenderWebPart() method.
        /// 
        protected override void CreateChildControls()
        {
            if (!_error)
            {
                try
                {
                    base.CreateChildControls();

                    lbl1 = new Label();
                    lbl1.ID = "lblInitialDate";
                    lbl1.Width = 300;
                    lbl1.Text = "Label con texto";
                    lbl1.Font.Size = new FontUnit(24);
                    this.Controls.Add(lbl1);

                    this.Controls.Add(new LiteralControl("
"));
                    this.Controls.Add(new LiteralControl("
"));

                    this.Height = "200";
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            lbl1.Text = this.BackColor.ToHex();
        }

        public override EditorPartCollection CreateEditorParts()
        {
            List<Editorpart> editor = new List<Editorpart>();
            EditorPart ep = new Blog.Webparts.WebPartCode.ColorEditor();
            ep.ID = this.ID + "_ColorEditor";
            editor.Add(ep);
            EditorPartCollection baseEditors = base.CreateEditorParts();
            return new EditorPartCollection(baseEditors, editor );
        }

        /// 
        /// Ensures that the CreateChildControls() is called before events.
        /// Use CreateChildControls() to create your controls.
        /// 
        protected override void OnLoad(EventArgs e)
        {
            if (!_error)
            {
                try
                {
                    base.OnLoad(e);
                    this.EnsureChildControls();
                    ScriptManager sm = ScriptManager.GetCurrent(this.Page);
                    if (sm == null)
                    {
                        sm = new ScriptManager();
                        this.Controls.AddAt(0,sm);
                    }
                }
                catch (Exception ex)
                {
                    HandleException(ex);
                }
            }
        }

        /// 
        /// Clear all child controls and add an error message for display.
        /// 
        private void HandleException(Exception ex)
        {
            this._error = true;
            this.Controls.Clear();
            this.Controls.Add(new LiteralControl(ex.Message));
        }
    }
}

De aquí pueden descargar el codigo completo

Happy Coding!


jueves, 27 de agosto de 2009

Screenshot de cualquier elemento en Silverlight 3

Una forma sencilla de obtener un screenshot de casi cualquier elemento dentro de un objeto Silverlight, es utilizar la clase WriteableBitmap, y usar el método Render que recibe como parámetro un objeto que derive de UIElement, es por eso que virtualmente se le puede sacar la instantánea a cualquier elemento, con unas pocas líneas de código, como las siguientes: 

public Image GetImageFromUIElement(UIElement uiElement) 
{ 
       WriteableBitmap bm = new WriteableBitmap((int)uiElement.RenderSize.Width, (int)uiElement.RenderSize.Height); 
       bm.Render(container, new MatrixTransform()); 
       bm.Invalidate(); 
       Image im = new Image(); 
       im.Source = bm; 
       return im; 
}
La clase WriteableBitmap, puede ser usada como fuente de datos para un objeto Image y asi mostrarlo en pantalla o guardarlo en un archivo.Se me ocurren algunas interesantes aplicaciones como:
  1.  Un método Helper para guardar instantáneas de tu aplicación, en el momento exacto en que truena ocurre un fallo inesperado y asi complementar las explicaciones de los usuarios, tales como, “La aplicación falló cuando la estaba utilizando”
  2. Obtener thumbnails de Videos.
  3. Etc.
Espero encuentren un buen uso a esta clase y me pasen el tip 


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)