[ASP.NET] Mantenimiento de sitios web: App_Offline.htm

Todavía me sorprendo cuando la gente se pone a hacer mantenimientos de aplicaciones sin informar de que se están realizando tareas de mantenimiento.

A partir de ASP.NET 2.0 hay una forma sencillísima de hacer esto, que es poner un fichero llamado App_Offline.htm en el directorio virtual de nuestra aplicación web, sí tenemos más de un servidor podemos crearnos un script que copie este fichero a todos los directorios y otro para que una vez que se hayamos terminado las tareas de mantenimiento borre dicho fichero.

El contenido del fichero puede ser algo como esto:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head>

    <title>Estamos realizando tareas de mantenimiento web</title>

</head>

<body>

    <h1>Estamos realizando tareas de mantenimiento web.</h1>

</body>

</html>

Al copiar el fichero App_Offline.htm en nuestro directorio virtual, el runtime de ASP.NET se encargará de cerrar la aplicación web, descargar el app domain del servidor y no procesará nuevas peticiones que se hagan a la aplicación web.

Pues ya no hay excusas para que los usuarios que esten visitando una web se encuentren con alguna que otra sorpresa :)

Un saludo

[VSTO 4.0] Mejoras respecto a la versión 3.0

A partir de ahora y sí el tiempo me lo permite, voy a empezar a escribir sobre la nueva versión de VSTO. A través de ejemplos nos adentraremos en este desconocido mundo, y digo desconocido porque la información que hay al respecto es escasísima y en esta nueva versión se pueden hacer cosas muy interesantes 😉

Lo primero es ver que nuevas mejoraras han incorporado el equipo de producto:

Soporte para NET 4.0

Todo lo que incorpora el framework 4.0 lo tenemos disponible en la nueva versión de VSTO.

Por ejemplo, quién no recuerda esto:

object iconIndex = Missing.Value;

object link = true;

object placement = Missing.Value;

object displayAsIcon = true;

object dataType = Missing.Value;

object iconFileName = Missing.Value;

object iconLabel = Missing.Value;

 

content.Range.PasteSpecial(ref iconIndex,

                           ref link,

                           ref placement,

                           ref displayAsIcon,

                           ref dataType,

                           ref iconFileName,

                           ref iconLabel);

 

Pues ahora no es necesario, podemos hacer uso de los parámetros opcionales de C#:

content.Range.PasteSpecial(Link: false, 

                           DataType: Word.WdPasteDataType.wdPasteBitmap);

 
Podemos destacar también el uso de LINQ, WCF…
 

UI

La parte de interfaz gráfica también ha sufrido un cambio bastante importante. Para mí la mejor noticias es que podemos usar WPF, sí lo estas oyendo bien, WPF. Imaginate lo que se puede hacer ahora con un TaskPane, vamos que los límites los pone tu imaginación.

private void CreateTaskPanes()

{

    Forms.UserControl taskPane = new Forms.UserControl();

 

    taskPane.Controls.Add(

        new ElementHost

        {

            Child = new PositionReportDialog(),

            Dock = DockStyle.Fill

        });

 

    Microsoft.Office.Tools.CustomTaskPane snippetsTaskPane =

        Globals.ThisAddIn.CustomTaskPanes.Add(taskPane, Properties.Resources.PositionReportTitle);

 

    snippetsTaskPane.Width = 400;

}

 

PositionReportDialog es un wizard desarrollado con WPF y MVVM, ¿acojonante no?

Otra cosa que me ha gustado mucho son los CallBacks de la Ribbon, por ejemplo, si quieres deshabilitar un control, si quieres cargar una imagen en un botón, o localizar textos… puedes hacer uso de los CallBacks:

<button id="btnRibbonEvolution" getLabel="GetLocalizeText" getImage="GetButtonImage" onAction="ShowReport" />

En este caso concreto hay 2 CallBacks y un evento, la firma del CallBack es esta:

 
public System.Drawing.Bitmap GetButtonImage(Office.IRibbonControl control)

{

    return (System.Drawing.Bitmap)Properties.Resources.ResourceManager.GetObject(control.Id);

}

Todos los CallBacks reciben como parámetro el control qué lo ha llamado.

Otra cosa nueva es el BackStage View, que es un conjunto de comandos que podemos usar para hacer cosas a un documento. Este es el aspecto del BackStage View de Word

image

Podemos customizarlo a través del fichero Ribbon.xml:

<?xml version="1.0" encoding="UTF-8"?>

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">

    <ribbon>

        <tabs>

        </tabs>

    </ribbon>

    <backstage>

        <tab></tab>

    </backstage>

</customUI>

Y por último los Context Menus:

image

que al igual que el BackStage View podemos crearlos mediante el fichero Ribbon.xml.

De momento esto es todo lo que quería destacar, hay más mejoras pero estas son las que más me han llamado la atención, en el siguiente veremos como crear un ejemplo y como se integra todo esto con Visual Studio 2010.

Para más info:

VSTO Developer Center

Hasta pronto!

[Visual Studio 2010 Bug] There are no Content Types in the project

Acabo de enviar un Bug que me he encontrado en Visual Studio 2010 trabajando con un Site Definition:

https://connect.microsoft.com/VisualStudio/feedback/details/576388/there-are-no-content-types-in-the-project#details

La cosa es sencilla de reproducir:

Partiendo de esta solución

image

Añadimos un SiteDefinition Project:

image

Seleccionamos el Site:

image

Y tendremos algo como esto:

image

 

 

A continuación, añadimos un nuevo ContentType:

image

Seleccionamos Announcement:

image

Y por último, añadimos un List Definition From Content Type:

image

y tachán:

image

Workaround cutre made in by me:

Movemos el SiteDefinition project a la raíz de nuestra solución:

image

Volvemos a añadir un List Definition From Content Type:

image

Y ya nos aparece el wizard para seleccionar el ContentType de los que tenemos en el proyecto.

Un saludo

[MOSS] Ocultar las “Acciones del Sitio” en SharePoint

Un post rápidito pero que a más de uno vendrá bien:

En ocasiones es necesario ocultar ciertos controles de SharePoint en función de los permisos que tenga. Por ejemplo, para ocultar las Acciones del Sitio a usuarios que no tengan el permiso ManageWeb (Administradores de la colección de sitios) la solución es sencilla,  para ello disponemos del control SPSecurityTrimmedControl

<Sharepoint:SPSecurityTrimmedControl ID="spstcrtlsa" runat="server" PermissionsString="ManageWeb">

     <PublishingSiteAction:SiteActionMenu runat="server"/>

</Sharepoint:SPSecurityTrimmedControl>

La lista con todos los permisos la podéis ver aquí:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spbasepermissions.aspx

Voy a escribir otro post comentando el problema que existe sí usamos esta misma técnica para ocultar la consola de publicación.

Un saludo y buen finde a todos.