Optimizar trafico en JSON

Problema

Frecuentemente al realizar llamadas ajax a servicios se retorna un objeto JSON. Para resultados complejos es ideal debido a la facilidad y a lo practico que resulta estructurar la información. Pero en este caso el principal problema es el espacio/tamaño que ocupa la respuesta. Esto es debido a que el resultado se retorna al navegador cliente como texto plano. El tiempo de transmisión de la información es más elevado del realmente necesario. Pero es posible optimizar la respuesta; dado que los navegadores son capaces de aceptar peticiones comprimidas (gzip,deflate…). Al aplicar la compresión se obtiene un reducción del 88% del tamaño de la respuesta (al menos en mi caso).

Propuesta

En IIS tenemos la capacidad de habilitar la compresión para las respuestas JSON. Adjunto enlace Como habilitar compresión en IIS.
Pero en muchos casos no tenemos los privilegios para habilitar la compresión o no queremos habilitarlo en general.

Solución:

La propuesta consiste en crear un filtro de Acción de MVC (ActionFilterAttribute).
Para aplicarlo solo faltaría añadir el atributo CompressFilter a nuestra acción; como en el ejemplo adjunto. Lo aplicaríamos en las acciones que retornen JSON y queramos realizar compresión del mismo.

[CompressFilter]
public JsonResult QueryReturn(QueryParameter p)
{
...
}

El código del atributo filtro es el siguiente:
using System.Web;
using System.Web.Mvc;
using System.IO.Compression;

namespace Infrastructure.Compress
{

 public class CompressFilter : ActionFilterAttribute
 {
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   var request = filterContext.HttpContext.Request;
   var acceptEncoding = request.Headers["Accept-Encoding"];
   if (string.IsNullOrEmpty(acceptEncoding)) return;
   acceptEncoding = acceptEncoding.ToLowerInvariant();

   var response = filterContext.HttpContext.Response;

   if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
   {
     response.AppendHeader("Content-encoding", "deflate");
     response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
   }
   else if (acceptEncoding.Contains("gzip"))
   {
     response.AppendHeader("Content-encoding", "gzip");
     response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
   }
  }
 }
}

Notas

Se da más prioridad a la compresión deflate sobre gzip. Deflate es menos intensa en recursos de servidor (40% menos).

Publicado en Desarrollo | Etiquetado , , | 2 comentarios

Ejecutando un servicio en BackGround en IIS (Azure)

Objetivo

El objetivo es lanzar la un tarea en background desde el IIS de manera simple; evitando los costes y/o complejidades innecesiarias (Azure Worker Role, Windows Service…).

Propuesta

Hay un excelente articulo The Dangers of Implementing Recurring Background Tasks In ASP.NET de Phil Haack donde se describen los problemas asociados a las tareas en background lanzadas desde IIS.

El problema consiste básicamente en el parada de los proceso Web del IIS:

  • Por modificación del Web.Config
  • Reciclado del pool del IIS ya sea tras 29 horas o por inactividad del mismo
  • Reinstalación de la aplicación

La propuesta de Phil Haack; se basa en registrar el job a los eventos del proceso de Web mediante HostingEnvironment.RegisterObject. Cuando nos registramos ante la parada somos notificados mediante el metodo Stop de la interfaz IRegisteredObject.

Existen dos problemas:

  • El articulo propone que antes de la tarea periodica; se verifique que no se ha solicitado la parada del job para proceder en consecuencia. El problema existe cuando la tarea peridiodica tarda más de los 30 segundos que nos ofrece de timeout del método Stop. En este caso no funcionaria.
  • Otro problema es el parada inesperada de la aplicación, ya sea por cuelgue, ejecución del comando IISReset, muerte del proceso IIS… En estos casos la aplicación no tiene notificación de este evento con lo que tampoco funcionaria.

Propuesta Modificada

Para solventarlo;  la solución propuesta consiste en definir una acción de parada independientemente que la tarea periodica este en curso. Esto puede provocar problemas en la tarea periodica que deberíamos controlar; que igualmente ocurrirían. Pero podemos asegurarnos en la acción de parada de tomar las medidas oportunas para no dejar recursos bloqueados.

Además en el reinicio del JobHost se fuerza una parada del mismo; por si la aplicación se paro de forma inesperada (En este caso los recursos solo se liberarían al arrancar de nuevo la aplicación).

En el constructor de la clase JobHost; pasamos dos delegados: uno para abrir los recursos y otro para cerrarlos. El delegado de cierre se llamara automáticamente al parar el Pool Web del IIS y al reiniciar la aplicación.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web.Hosting;

namespace Infrastructure.Job
{
    public class JobHost : IRegisteredObject
    {
        private bool _shuttingDown;
        private readonly Action _jobShuttdownAction;

        public JobHost(Action jobStartAction, Action jobShuttdownAction)
        {
            HostingEnvironment.RegisterObject(this);
            jobShuttdownAction();
            jobStartAction();
            _jobShuttdownAction = jobShuttdownAction;
        }

        public void Stop(bool immediate)
        {
            _shuttingDown = true;
            _jobShuttdownAction();
            HostingEnvironment.UnregisterObject(this);
        }

        public void Run(Action jobWorkAction, int sleepMilliseconds)
        {

            while (true)
            {
                if (_shuttingDown)
                {
                    return;
                }
                try
                {
                  jobWorkAction();
                } catch {}
                Thread.Sleep(sleepMilliseconds);
            }
        }
    }
}

En Application_Start lanzamos nuestro Job con la clase JobHost

ThreadPool.QueueUserWorkItem(state => new JobHost(MyJob.Start,MyJob.Stop).Run(MyJob.DoWork, 100));

Publicado en Azure, Desarrollo | Etiquetado , , | Deja un comentario

Soporte Windows Azure

Esta semana Azure tuvo problemas en sus servicios por el efecto 29 de febrero http://blogs.msdn.com/b/windowsazure/archive/2012/03/01/windows-azure-service-disruption-update.aspx
Vamos a redactar un pequeño esquema con los pasos a seguir:

Paso 1 Identificar el estado

Acceder al Estado de Panel de Servicios de Azure. Aquí podemos observar si hay alguna incidencia en los servicios.

Paso 2 Soporte

El servicio de soporte tiene una gran calidad; y esta disponible interrumpidamente. Podemos dirigirnos cuando hay algún evento que afecta a la disponibilidad y continuidad del servicio; y no se encuentra planificado.

Web Online http://www.microsoft.com/windowsazure/support
Teléfono 900 811 573 o (91) 275 4555 (Lunes a Viernes 9-5 en castellano resto horarios en ingles)

Paso 3 Generar una incidencia

Tras contactar con el servicio nos envían un correo con un numero de incidencia. El equipo de Azure trabaja en la incidencia; informadonos del estado misma y realizando un seguimiento conjunto de la misma. Este número de incidencia en función de la gravedad nos puede suponer un descuento en la factura de Azure (esta estipulado en los contratos de servicio; hay un porcentaje de descuento que varia en función del tiempo sin servicio).

Publicado en Azure, Uncategorized | Etiquetado | Deja un comentario

Cobit y Windows Azure

IT Control Objectives for CLOUD COMPUTINGCOBIT es un marco de trabajo creado por ISACA reconocido mundialmente de buenas prácticas para el gobierno de IT. ISACA recientemente acaba de editar el libro IT Control Objectives for Cloud Computing: Controls and Assurance in the Cloud.
En el libro se describen tres recomendaciones para el cloud:

  • Riesgo
  • Confianza
  • Regulaciones

Vamos a describirlas y ver como se cubren en Windows Azure.

Riesgo

En COBIT el riesgo se define como la perdida de confidencialidad, integridad o disponibilidad de la información o de los sistemas de proceso de información.

  • Riesgo de Privacidad y Accesos no autorizados. IAM nos provee control de acceso a la información por parte de los usuarios (se base en sus roles, tipo de información…). Este control de acceso debe ser revisado regularmente. Es de vital importancia tener bajo control, ya que los accesos no autorizados son la primera causa de pérdida o robo de datos. Es importante identificar los accesos que se realizan en el cloud
  • Riesgo Físico de los Datos. No debe esta delegado en nuestro proveedor; hemos de tener presente:
    • Ubicación de los mismos y las conexiones de internet.
    • Disponer SLA la actuación esperada en caso de desastre.
  • Riesgo Operacional. Cambios en los procesos al mover datos al exterior; nos ayudara tener un inventario de la información.

Riesgo en Windows Azure

Como lo cubre Windows Azure:

  • Políticas de Seguridad en Accesos:
    • Acceso al Administrador de Servicios en SSL (Windows Live Id).
    • Subida de la Aplicación mediante un certificado autofirmado publico/privado o desde el Administrador de Servicios.
    • Acceso a los Datos/SQL de la Aplicación mediante clave de cuenta.
  • Políticas de Seguridad en Servidores:
    • Virtualización de Servidores que ofrece un nivel de encapsulamiento a nivel de seguridad.
    • Filtrado de tráfico no autorizado tanto de entrada como de salida a los Servidores.
    • Servidores en una red VLAN propia y aislada.
    • Acceso a los Datos vía SSL.
    • Ofrece mecanismos para auditar el funcionamiento del aplicativo instalado.
    • Redundancia triple de Datos.
    • Mantenimiento automático de Servidores; sin caída del servicio.

Confianza

En COBIT la confianza se define como aquello que nos permite evaluar el riesgo, control o gobierno de los procesos para la organización. En el cloud el seguimiento debe ser más a tiempo real, continuo y orientado a procesos. Los Proveedores de cloud realizan actividades encaminadas a crear valor, controlar el riesgo y optimizar recursos. Es básico que ofrezcan una política de transparencia de Procesos.
Los elementos a considerar son:

  • Los marcos de trabajo usados; que pueden ser:
    • Marcos estándars adaptados al cloud (COBIT, AICPA, ISO2700*…)
    • Marcos creados para el cloud (Cloud Secury Matirx, NIST, HITRUST…).
  • Auditorias, Certificaciones,… y auditadas a nivel externo
  • Nivel de Servicio. Cloud Computing requiere de una monitorización continua para verificar la conformidad a lo acordado. SLA debe establecer las métricas de medición de la Calidad del Servicio; que deben ser específicas al servicio y medibles. Necesitamos que este recogida de datos pueda ser medido independientemente y por terceras partes.

Confianza en Windows Azure

Windows Azure posee la ISO/IEC 27001. Esta ISO/IEC 27001 se focaliza en define los requisitos para un Information Security Management System ISMS . La norma adopta un enfoque por procesos para establecer, implantar, operar, supervisar, revisar, mantener y mejorar un SGSI. Enlace con la certificación obtenida auditada por la entidad certificadora British Standards Institute (BSI)
En línea con lo descrito en el manual de referencia; es una buena práctica. Ya que la ISO 27001 requiere de una revisión continúa. Los beneficios que aporta son:

  • Auditoría independiente.
  • Estándares aceptados a nivel internacional; y especialmente a nivel europeo.
  • Cubre la mayoría de riesgos aplicables al cloud.

SLA Disponible en el siguiente link
Este contrato se organiza en subcontratos en función de los servicios ofrecidos. Además para cada servicio se describe a nivel de detalle el estado que se considera caída de servicio.
En principio el contrato está en la línea de lo indicado en las recomendaciones de COBIT. La única limitación es que para los servicios internos no hay una auditoría independiente; se limita al buen entendimiento de las partes (aportando nuestra organización las pruebas que estime oportunas).

Regulaciones

Un detalle básico en el cloud; es determinar donde se almacenan los datos introducidos. Hay regulaciones que se aplican al origen de los datos y otras que se aplican a localización física de los mismos. Y algunas veces son contradictorias entre sí.
SLA y contractos con el proveedor de cloud están muy recomendados. Estos SLA ofrecen una seguridad legal limitada. En general esto nos ofrece un estándar de cumplimiento unificado.

Regulaciones en Windows Azure

Aun hay camino por recorrer, un buen hilo de debate se encuentra en el siguiente link

Publicado en Azure, Cloud Computing | Etiquetado , , | Deja un comentario

Análisis de dependencias en SQL Server

Ocurre en determinadas ocasiones que realizamos un cambio en nuestra base de datos SQL Server; y desconocemos las implicaciones que tiene en la base de datos.

El siguiente script nos permite determinar el nivel de afectación de un cambio; nos retorna el resultado por niveles. En el primer nivel las dependencias directas, en segundo nivel las dependencias del primer nivel y así sucesivamente.

-- View Dependences of Object Database element
DECLARE @NAME varchar(250)
-- Assign Object Database element name
set @NAME = 'dbo.Cliente'

DECLARE @LEVEL int
DECLARE @COUNTAnt int
DECLARE @COUNT int
DECLARE @NAMEITEM varchar(250)
set @LEVEL = 0
set @COUNTAnt = 0
set @COUNT = 0

SELECT referencing_schema_name, referencing_entity_name,
referencing_id, referencing_class_desc, is_caller_dependent, @LEVEL as 'level'
INTO #DEPENCENDE
FROM sys.dm_sql_referencing_entities (@name, 'OBJECT');

SET @COUNTAnt = @COUNT
SELECT @COUNT = COUNT(*) FROM #DEPENCENDE

WHILE (@COUNTAnt <> @COUNT)
	BEGIN

		DECLARE DEPENDS CURSOR
			FOR
			SELECT referencing_entity_name FROM #DEPENCENDE WHERE level = @LEVEL

		OPEN DEPENDS
		FETCH NEXT FROM DEPENDS into @NAMEITEM
		WHILE (@@FETCH_STATUS = 0)
			BEGIN
				INSERT INTO #DEPENCENDE
				SELECT DEP.referencing_schema_name, DEP.referencing_entity_name, DEP.referencing_id, DEP.referencing_class_desc, DEP.is_caller_dependent, @LEVEL +1
				FROM sys.dm_sql_referencing_entities ('dbo.' +@NAMEITEM, 'OBJECT') DEP
				LEFT JOIN #DEPENCENDE DT ON DEP.referencing_entity_name = DT.referencing_entity_name
				WHERE DT.referencing_entity_name IS NULL
				FETCH NEXT FROM DEPENDS into @NAMEITEM
			END

		CLOSE DEPENDS
		DEALLOCATE DEPENDS

		SET @LEVEL = @LEVEL + 1
		SET @COUNTAnt = @COUNT
		SELECT @COUNT = COUNT(*) FROM #DEPENCENDE

	END

SELECT referencing_entity_name, level FROM #DEPENCENDE
ORDER BY LEVEL

DROP TABLE #DEPENCENDE

Retorno del Script

Al ejecutar el script se retorna:

EliminarCliente 0
VistaBasicaCliente 0
VistaTopCliente 1
EliminarClientes 1
VistaVipCliente 1
VistaVipTopCliente 2

Nota:

Este script no está disponible para SQL Azure; dado que se apoya en la funcion sys.dm_sql_referenced_entities que no está soportada.

Publicado en Desarrollo, Sql Server | Etiquetado , | 1 comentario

Backup de Base de Datos SQL Azure con tan un solo comando

Mover una base de datos entre SQL Server Local y Azure siempre ha sido un trabajo farragoso y tedioso. Con la ultima actualización de DAC ya es posible obtener un backup de una base de datos de Azure con tan solo una linea de comando. Y con otra linea de comando restaurar el backup en otro SQL Server.

Realizar un Backup de una Base de Datos de SQL Azure

Ejecutar el siguiente comando sustituyendo adecuadamente:

daccli -S [SERVIDOR AZURE] -U [USUARIO] -P [PASSWORD]  -D [NOMBRE DE BASE DE DATOS] -F [RUTA LOCAL DEL BACKUP] -X

Ejemplo de ejecución del comando:

C:\Tools\DCImport\Import Export CLI V1.2>daccli -S servidorazure.database.windows.n
et -U usuario -P password  -D DataBase_Example_Azure -F C:\BACKUP.BACPAC -X
Microsoft (R) DAC Import Export Sample version 1.2.0.0
Copyright (C) Microsoft Corporation. All rights reserved.

Connecting to servidorazure.database.windows.net...
Connection Open.
Export started: 24/11/2011 9:02:32
[19:02:34] ExtractDac: Pending Extracting Database 'DataBase_Example_Azure'
[19:03:19] ExtractDac: Success Extracting Database 'DataBase_Example_Azure'
[19:03:19] ExportBacpac: Pending Exporting Database 'DataBase_Example_Azure'
[19:03:19] ExportTable: Pending Exporting table data for table 'Client'
[19:03:20] ExportTable: Success Exporting table data for table 'Client'
[19:03:20] ExportTable: Pending Exporting table data for table 'Invoice'
[19:03:20] ExportTable: Success Exporting table data for table 'Invoice'
[19:03:20] ExportTable: Pending Exporting table data for table 'Address'
[19:04:15] ExportTable: Success Exporting table data for table 'Address'
[19:15:18] ExportBacpac: Success Exporting Database 'DataBase_Example_Azure'
Export Complete.  Total time: 00:12:45.8893794
Output file: C:\BACKUP.BACPAC Size: 41331752 bytes

Restaurar el Backup en una Base de Datos de SQL Local

Ejecutar el siguiente comando sustituyendo adecuadamente

  • Con autenticación de SQL:

daccli -S [SERVIDOR LOCAL] -U [USUARIO] -P [PASSWORD]  -D [NOMBRE DE BASE DE DATOS] -F [RUTA LOCAL DEL BACKUP] -I

  • Con Autenticación Integragada:

daccli -S [SERVIDOR LOCAL] -E -D [NOMBRE DE BASE DE DATOS] -F [RUTA LOCAL DEL BACKUP] -I

Ejemplo de ejecución del comando:

C:\Tools\DCImport\Import Export CLI V1.2>daccli -S SERVIDORBD\SQL2008 -U usuario -P
 password -D DataBase_Example_Local-F C:\BACKUP.BACPAC -I
Microsoft (R) DAC Import Export Sample version 1.2.0.0
Copyright (C) Microsoft Corporation. All rights reserved.

Import started: 23/11/2011 20:37:33
Connecting to SERVIDORBD\SQL2008...
Connection Open.
[20:38:02] PrepareSystemTables: Pending Preparing DAC metadata in the SQL Server
 instance 'SERVIDORBD\SQL2008'
[20:38:02] PrepareSystemTables: Success Preparing DAC metadata in the SQL Server
 instance 'SERVIDORBD\SQL2008'
[20:38:04] CreateDatabase: Pending Creating database 'DataBase_Example_Local'

[20:38:05] CreateDatabase: Success Creating database 'DataBase_Example_Local'

[20:38:05] ScriptDACObjects: Pending Preparing deployment script
[20:38:13] ScriptDACObjects: Success Preparing deployment script
[20:38:13] CreateDatabaseObjects: Pending Creating schema objects in database 'D
ataBase_Example_Local'
[20:38:17] CreateDatabaseObjects: Success Creating schema objects in database 'D
ataBase_Example_Local'
[20:38:17] PrepareImportTables: Pending Preparing Import data from tables of dat
abase 'DataBase_Example_Local'
[20:38:17] PrepareImportTables: Success Preparing Import data from tables of dat
abase 'DataBase_Example_Local'
[20:38:17] ImportTable: Pending Importing data from table'[dbo].[Client]'
[20:38:18] ImportTable: Success Importing data from table'[dbo].[Client]'
[20:38:18] ImportTable: Pending Importing data from table'[dbo].[Invoice]'
[20:38:18] ImportTable: Success Importing data from table'[dbo].[Invoice]'
[20:38:18] ImportTable: Pending Importing data from table'[dbo].[Address]'
[20:38:52] ImportTable: Success Importing data from table'[dbo].[Address]'
[20:38:53] FinalizeImportTables: Pending Finalizing Import data from tables of d
atabase 'DataBase_Example_Local'
[20:38:56] FinalizeImportTables: Success Finalizing Import data from tables of d
atabase 'DataBase_Example_Local'
[20:38:56] RegisterDAC: Pending Registering the DAC in DAC metadata.
[20:38:56] RegisterDAC: Success Registering the DAC in DAC metadata.
Import Complete.  Total time: 00:01:23.6661365

Instalación del entorno de ejecución de Comandos

Instalar DAC Framework API y Ejecutable DAC ImportExportTool que se apoya en esta API para realizar los backups y restores.

Los pasos a seguir:

  • Instalar los siguientes paquetes; actualizan a la ultima versión DAC.

Estos paquetes instalan la versión del DAC disponible en la ultima versión de SQL Server “Denali”; esta incluye las mejoras que permiten la importación y exportación de BACPAC. En la pagina adjunta se describen los necesarios para utilizar disponibles:
http://sqldacexamples.codeplex.com/wikipage?title=Required%20Assemblies%20Links&referringTitle=Home

NOTA: Asegurarse aunque no lo indique la instalar primero System CLR Types SQLSysClrTypes.msi

  • Bajar el Paquete DAC Import Export Client-side Tools

http://sqldacexamples.codeplex.com/releases
Dentro del paquete tenemos el archivo ejecutable daccli.exe. Si lo ejecutamos sin parametros veremos las opciones disponibles

Limitaciones

Los ficheros BACPAK no son consistentes transacionalmente. En estos ficheros se generan realizando un volcado iterativo de las tablas como se ve en el ejemplo de ejecución. Esto puede ser problemático si hacemos un backup de la base de datos se esta modificando; ya que nos encontraremos errores de coherencia. Si no podemos evitar que la base datos se este modificando podemos generar una base de datos de copia apartir de la que queremos realizar el backup; y realizar el backup de esta.

CREATE DATABASE [DataBase_Example_Local_ToBackup] AS COPY OF[DataBase_Example_Local]
--STATE OF DATABASE COPY
--SELECT name, state, state_desc from sys.databases WHERE name = 'DataBase_Example_Local_ToBackup'
--RENAME DATABASE BACKUPED TO ORIGINAL
--ALTER DATABASE DataBase_Example_Local_ToBackup] MODIFY NAME = [DataBase_Example_Local]

Más info del crear bases de datos como copia.
http://msdn.microsoft.com/en-us/library/windowsazure/ff951624.aspx

Mejoras

Este método sirve para mover base de datos entre diferentes versiones de SQL

  • Versiones Exportables: SQL Azure, SQL Server “Denali”,SQL Server 2008 R2 ,SQL Server 2008,SQL Server 2005,SQL Server 2000
  • Versiones Importables: SQL Azure, SQL Server “Denali” , SQL Server 2008 R2, SQL Server 2008 (SP1),SQL Server 2005 (SP4)
Publicado en Azure, Base de Datos, Sql Server | Etiquetado , , , , , , , | 1 comentario

Azure Directory Lucene en Azure

La librería de indexación de Lucene.NET; esta también disponible para Azure. En el siguiente link: http://code.msdn.microsoft.com/Azure-Library-for-83562538
Este paquete ofrece la clase AzureDirectory que implementa un LuceneDirectory. Esta clase permite persistir los datos del índice generados en el blog storage de Azure. Para usarlo de la manera más simple indicamos nuestra cuenta de Blog Storage y Contenedor donde almacenaremos el índice. El contenedor se crea si no existe.

Uso

Para usarla, están fácil como indicar el cloudstorage y el contenedor:

AzureDirectory azureDirectory = new AzureDirectory(cloudStorageAccount, nameContainer);
IndexSearcher searcher = new IndexSearcher(azureDirectory);

Internamente el AzureDirectory trabaja con un directorio de la maquina y este se sincroniza con el Blog Storage. La ruta por defecto es “D:\Windows\Temp\AzureDirectory\{nameContainer}”.

Esquema Azure Directory Lucene

Es decir por defecto utiliza el directorio temporal; aunque podemos forzar otro directorio.

AzureDirectory azureDirectory = new AzureDirectory(cloudStorageAccount, nameContainer, FSDirectory.GetDirectory(@"e:\Lucene"));

IndexSearcher searcher = new IndexSearcher(azureDirectory);

A partir de aquí el uso es el normal de la api de Lucene.

Problemas de Deploy en Azure

En Azure el proyecto de Web Role se configura en IIS con el Identity Network Service. Este no tiene privilegios para acceder al directorio local donde se apoya el AzureDirectory; con lo que al acceder al sistema de ficheros causará una Excepción.
Las posibles vías de solución son:

  • Escalando privilegios; de esta manera podremos acceder al sistema de archivos. De varias formas:
    • Habilitando la impersonación de la aplicación en el web.config con un usuario que tenga derechos.
    • Configurando el IIS con un modo con más privilegios, como Local System.

    Pero es una práctica desaconsejada ya que elevamos los privilegios de la aplicación; y hace nuestra aplicación más vulnerable a ataques.

  • Trabajar en memoria con RAMDirectory. No factible para indices de gran tamaño.
  • Habilitar privilegios al directorio.

Habilitando privilegios al directorio local de AzureDirectory Lucene

Podemos dar los privilegios al directorio especifico para nuestra aplicación. La unica manera en la que tenemos derechos para asignar derechos es al arrancar el WebRole; ya sea mediante un comando o WebRole Start.
En nuestro caso optamos por la segunda opción

public class WebRole: RoleEntryPoint
{
  public override bool OnStart()
  {
            var lucenePath = System.IO.Path.Combine(Path.GetTempPath(), "AzureDirectory");
            var dirInfo = new DirectoryInfo(lucenePath);
            if (!dirInfo.Exists)
                 dirInfo.Create();
            var dirSecurity = dirInfo.GetAccessControl();
            var fileSystemAccessRule = new FileSystemAccessRule("NETWORK SERVICE", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow);
            dirSecurity.AddAccessRule(fileSystemAccessRule);
            dirInfo.SetAccessControl(dirSecurity);
				return base.OnStart();
  }
}

Nota:Es importante recordar, hay que ejecutar en contexto elevado para poder tener derechos para asignar los permisos.

  <WebRole name="WebApplication2" vmsize="ExtraSmall">
     <Runtime executionContext="elevated" />
  </WebRole>

Publicado en Azure, lucene | Etiquetado , , | 1 comentario