Posts Tagged ‘.NET’

0 26
05
2012

String Replace Ignore Case en C# y VB.NET

Sábado, mayo 26th, 2012

En el día a día del programador, suelen surgir multitud de dudas, que aunque parecen más que obvias, siempre te hacen acudir a internet a buscar la mejor solución.

Hace un par de días, me encontré ante la necesidad de algo tan sumamente sencillo como reemplazar un texto por otro en una cadena, pero ignorando mayúsculas y minúsculas, trabajando en C# .NET.

Lo primero en lo que pensé es que el método String.Replace de .NET permitiría añadir un parámetro opcional para indicar este modificador, pero no es así, por lo que tenemos que buscarnos las habichuelas por otra parte.

Cierto es que tampoco nos tenemos que ir muy lejos, y es nuevamente el poder de las expresiones regulares el que nos permite construir nuestro propio String Replace siendo insensible a mayúsculas y minúsculas.

Ejemplo de Replace Ignore Case en C#

    public string ReplaceIgnoreCase(string original, string search, string replace)
    {
	// Reemplazo habitual
        string value = original.Replace(search, replace);
	// Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
        string value2 = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        return value2;
    }

...
        string original = "La parte contratante de la primera parte";
        string search = "PaRtE";
        string replace = "cosa";
        string replaced = ReplaceIgnoreCase(original, search, replace);

...

Ejemplo de Replace Ignore Case en VB.NET

Public Function ReplaceIgnoreCase(original As String, search As String, replace As String) As String
	' Reemplazo habitual
	Dim value As String = original.Replace(search, replace)
	' Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
	Dim value2 As String = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
	Return value2
End Function
0 24
03
2012

Failed to access IIS metabase ASP.NET

Sábado, marzo 24th, 2012

Si estás intentando ejecutar tu aplicativo web sobre Internet Information Server (IIS) y recibes el siguiente mensaje de error

Failed to access IIS metabase

probablemente has instalado IIS después de instalar .NET Framework.

La solución pasa por reparar la instalación de ASP.NET Framework 2.0, para ello ejecutamos desde la consola de comandos de Visual Studio:

aspnet_regiis.exe -i

o desde la línea de comandos de Windows:

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

NOTA: Comprueba tu versión concreta de .NET Framework para indicarlo en la línea anterior.

Saludos a todos

3 07
03
2012

Instalador Web: Instalación sin completar

Miércoles, marzo 7th, 2012

Tenemos el siguiente escenario: Windows 7 + IIS7.

Disponemos a su vez de una solución generada en Visual Studio 2008, con diversos proyectos, entre los que se encuentra un sitio web.

Y nos proponemos ahora, la creación de un proyecto de instalación para la aplicación web.

Hasta aquí sin problemas, hasta que una vez generados los archivos de instalación Setup.exe y WebSetup.msi, recibimos el siguiente mensaje de error al ejecutarlos:

Instalación sin completar

Se interrumpió el instalador antes de poder instalar (NOMBREDELPROYECTO). Debe reiniciar el instalador para intentarlo de nuevo.

Web Setup: Instalación sin completar

Web Setup: Instalación sin completar

Tras buscar por internet posibles soluciones, decidimos activar la compatibilidad de Internet Information Server con IIS6, y probar suerte.

Para ello, accedemos al Panel de Control de Windows 7, y pinchamos en la opción Activar o desactivar las características de Windows.

Panel de Control Windows 7

Panel de Control Windows 7

Buscamos la opción Internet Information Server, y expandimos su rama, hasta encontrar Compatibilidad con la Administración de IIS6.

Una vez ahí, activamos todas las opciones de Compatibilidad con la Administración de IIS6 como muestra la siguiente imagen:

Activar características de Windows - Compatibilidad IIS6

Activar características de Windows - Compatibilidad IIS6

Et voilà! Volvemos a intentar ejecutar los archivos de instalación del proyecto web generados anteriormente y conseguimos continuar la instalación sin los problemas generados con anterioridad.

Web Setup: Asistente de instalación

Web Setup: Asistente de instalación

1 23
01
2012

Cómo crear un Servicio de Windows

Lunes, enero 23rd, 2012

Hoy vamos a realizar un pequeño y rápido repaso de cómo crear un Servicio de Windows, en nuestro caso, desde Visual Studio 2008.

Tomaremos como base el siguiente enlace oficial de microsoft: http://msdn.microsoft.com/es-es/library/9k985bc9(v=VS.90).aspx

Creando Windows Service

En primer lugar, seleccionaremos el tipo de plantilla Windows Service o Servicio de Windows para nuestro proyecto.

Plantilla Visual Studio de Windows Service

Plantilla Visual Studio de Windows Service

Una vez generado el proyecto, Visual Studio generará a partir de plantilla los siguientes archivos:

  • Service1.cs (renombrado por manías del guión como Service.cs)
  • Program.cs
Nuevo proyecto de Windows Service

Nuevo proyecto de Windows Service

En la clase Service.cs (recordemos que originalmente se llamaba Service1.cs), creamos los siguientes métodos:

  • onstart
  • onstop
  • oncontinue

#region "Service Methods"
protected override void OnStart(string[] args)
{
Console.WriteLine("Inicio servicio");
}

protected override void OnStop()
{
Console.WriteLine("Fin servicio");
}

protected override void OnContinue()
{
Console.WriteLine("Servicio en ejecución");
}

#endregion "Service Methods"

En el ejemplo simplemente escribimos por consola una traza del método que estamos ejecutando.

Métodos (OnStart, OnStop, OnContinue) Windows Service

Métodos (OnStart, OnStop, OnContinue) Windows Service

Llegados a este punto, el servicio ya podría arrancar, pero dependiendo de la lógica que deba implementar el servicio, tomaremos diferentes formas de mantener vivo el servicio:

Ejemplo 1: Queremos que nuestro servicio se mantenga a la escucha de recibir mensajes de fuentes externas, el pseudocódigo sería algo así:


while (true) {

listener.receive();

}

Ejemplo 2: Queremos que nuestro servicio ejecute tareas cada x tiempo, para lo cual necesitaríamos un Timer para gestionar la ejecución temporal de dichas tareas. En futuros posts crearemos un ejemplo de este tipo de servicios de windows con timer.

Instalando Windows Service

Vamos a preparar ahora nuestro servicio de windows para que podamos instalarlo, para ello:

1. Añadimos los servicios de instalación, clickando sobre el botón derecho sobre el diseñador de Service y clickamos en «Add Installer» o «Añadir Instalador«.

Agregar instalador en Windows Service

Agregar instalador en Windows Service

2. El paso anterior nos genera un nuevo archivo ProjectInstaller.cs como el de la imagen siguiente, agregando 2 nuevos componentes.

Instalador Servicio de Windows

Instalador Servicio de Windows

En las propiedades de ambos componentes del servicio podremos editar el nombre del servicio, el tipo de arranque (manual, automático o deshabilitado), la cuenta con la que se ejecutará el servicio, etc.

Propiedades instalador Windows Service

Propiedades instalador Windows Service

Por último, vamos a preparar la Instalación del servicio de Windows

Crearnos 2 archivos .bat uno para instalación y otro desinstalación, que ejecutarán el comando InstallUtil

Por ejemplo para instalar y desinstalar respecticamente

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil «C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe»pause

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil -u «C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe»pause

0 22
10
2011

Habilitar la pluralización de nombres

Sábado, octubre 22nd, 2011

Recientemente me encontraba realizando un proyecto en el que estaba utilizando linq para trabajar con base de datos.

Para ello, generamos nuestro modelo de datos mapeando la base de datos a través de la funcionalidad que proporciona Visual Studio: LINQ to SQL classes.

A grandes rasgos, lo que consigues mapeando tu base de datos a través de un modelo de datos, en este caso a través de LINQ, es generar clases correspondientes a cada una de las tablas existentes.

En próximos posts nos adentraremos más a fondo en cómo funciona LINQ, porque hoy es únicamente momento de explicar cómo habilitar la pluralización de nombres.

Pues bien, como hemos dicho, por cada tabla, se crea una clase, y ahí está el fin de este artículo. El proyecto del que os hablo, lo estaba realizando en diferentes ordenadores sobre Visual Studio 2008, y daba la casualidad, de que al regenerar el modelo de datos (LINQ to classes), en ocasiones aparecían los nombres de las clases en plural y en otras ocasiones los nombres de las clases en singular.

La primera vez no le di mayor importancia, seguro por desconocimiento, y lo achaqué a algún despiste inicial en la generación del diseño de datos.

Pues bien, nada más lejos de la realidad. Estos nombres de clases en plural o singular en nuestro modelo de datos generado para linq, podemos elegir si los deseamos trabajar en plural o singular.

Para ello, simplemente debemos configurar Visual Studio de la siguiente forma:

Herramientas –> Opciones

Dentro del cuadro de diálogo de Opciones, expandimos la sección de Herramientas para base de datos, para seleccionar a continuación la opción O/R Designer.

Una vez llegados a este punto, simplemente debemos elegir True o False para habilitar o no la pluralización de nombres del diseño de bbdd.

Nombres en plural modelo de datos LINQ

Nombres en plural modelo de datos LINQ

Para más información podéis acceder al siguiente enlace de microsoft: activar y desactivar la pluralización

1 09
05
2011

Cómo integrar WSE 3.0 en Visual Studio 2008

Lunes, mayo 9th, 2011

Recientemente en el trabajo, estamos desarrollando un proyecto en el que interactuar con un web services con WSE 3.0 integrada.

Por lo tanto, el primer paso fue instalar Web Service Enhancements (WSE) 3.0 for Microsoft .NET descargando el instalable desde esta dirección Web Service Enhancements (WSE) 3.0 for Microsoft .NET.

Una vez finalizada la instalación, no dispondremos todavía de esta herramienta integrada dentro de Visual Studio 2008. Para incorporar WSE 3.0 a nuestro entorno de trabajo Visual Studio 2008, podemos realizar los siguientes pasos:

1. Acudimos al directorio de instalación, en mi caso por ejemplo C:\Documents and Settings\All Users\Datos de programa\Microsoft\MSEnvShared\Addins

2. Editamos con el notepad (o similar) el archivo WSESettingsVS3.Addin (veréis que tiene formato xml)

3. Buscamos y sustituimos <Version>8.0</Version> por <Version>9.0</Version>, y finalmente guardamos los cambios.

4. Para terminar, abrimos Visual Studio 2008 y accedemos a: Tools (Herramientas) > Options (Opciones) > Add-in/Macros Security (Seguridad de Macros/Complementos)

5. Y añadimos nuestro directorio de instalación indicado en el punto 1 tal y como muestra la siguiente imagen.

Integrar WSE 3.0 en Visual Studio 2008

Integrar WSE 3.0 en Visual Studio 2008

No olvides «reiniciar» Visual Studio para contemplar los cambios realizados.

Ya podemos trabajar con WSE 3.0 integrado en Visual Studio 2008.

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

Integrar WSE 3.0 en Visual Studio 2008 - WSE 3.0 Settings

0 24
11
2010

Incrementar el número de conexiones sobre IIS

Miércoles, noviembre 24th, 2010

A medida que desarrollas tus aplicaciones en .NET sobre el servidor IIS (Internet Information Server) seguramente te habrás encontrado en alguna ocasión con el siguiente error:

«403.9: Access Forbidden: Too many users are connected«

Esto ocurre porque por defecto el número máximo de conexiones concurrentes permitidas se limita a 10 conexiones.

A mí personalmente me ha ocurrido cuando he querido realizar alguna batería de pruebas con un número ligeramente más alto a lo normal.

Pues bien, un pequeño truco para aumentar el número máximo de conexiones concurrentes permitidas sobre IIS es ejecutar el script adsutil.vbs, que normalmente se encuentra en el directorio inetpub, desde la ventana de comandos

>
>cscript c:\inetpub\adminscripts\adsutil.vbs set w3svc/MaxConnections 40
>

De esta forma hemos incrementado el número máximo de conexiones sobre Internet Information Server a 40, recibiendo en nuestro terminal un resultado como el de la siguiente imagen.

adsutil - aumentar número de conexiones sobre Internet Information Server

Sólo nos queda ahora reiniciar el servidor IIS.

>
>iisreset
>
9 11
11
2010

DateDiff en C#

Jueves, noviembre 11th, 2010

Una de las funciones de Visual Basic que más echamos de menos a la hora de programar en C# es DateDiff.

Para aquellos que no la conozcan, la función DateDiff de Visual Basic (probablemente también os sonará de DateDiff de SQL Server) devuelve un valor numérico que especifica el número de intervalos de tiempo entre 2 fechas; o traducido al castellano, nos devuelve la diferencia entre 2 fechas.

Pues bien, ya que la función DateDiff no existe en sí en C#, vamos a proponer a continuación una alternativa a la misma:

/// <summary>
/// Demo DateTime.DateDiff
/// </summary>
public class DateTimeExtension
{

    /// <summary>
    /// Devuelve un valor Long que especifica el número de
    /// intervalos de tiempo entre dos valores Date.
    /// </summary>
    /// <param name="interval">Obligatorio. Valor de enumeración
    /// DateInterval o expresión String que representa el intervalo
    /// de tiempo que se desea utilizar como unidad de diferencia
    /// entre Date1 y Date2.</param>
    /// <param name="date1">Obligatorio. Date. Primer valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <param name="date2">Obligatorio. Date. Segundo valor de
    /// fecha u hora que se desea utilizar en el cálculo.</param>
    /// <returns></returns>
    public static long DateDiff(DateInterval interval, DateTime date1, DateTime date2)
    {
        long rs = 0;
        TimeSpan diff = date2.Subtract(date1);
        switch (interval)
        {
            case DateInterval.Day:
            case DateInterval.DayOfYear:
                rs = (long)diff.TotalDays;
                break;
            case DateInterval.Hour:
                rs = (long)diff.TotalHours;
                break;
            case DateInterval.Minute:
                rs = (long)diff.TotalMinutes;
                break;
            case DateInterval.Month:
                rs = (date2.Month - date1.Month) + (12*DateTimeExtension.DateDiff(DateInterval.Year, date1, date2));
                break;
            case DateInterval.Quarter:
                rs = (long)Math.Ceiling((double)(DateTimeExtension.DateDiff(DateInterval.Month, date1, date2) / 3.0));
                break;
            case DateInterval.Second:
                rs = (long)diff.TotalSeconds;
                break;
            case DateInterval.Weekday:
            case DateInterval.WeekOfYear:
                rs = (long)(diff.TotalDays/7);
                break;
            case DateInterval.Year:
                rs = date2.Year - date1.Year;
                break;
        }//switch
        return rs;
    }//DateDiff
}

/// <summary>
/// Enumerados que definen los tipos de
/// intervalos de tiempo posibles.
/// </summary>
public enum DateInterval
{
    Day,
    DayOfYear,
    Hour,
    Minute,
    Month,
    Quarter,
    Second,
    Weekday,
    WeekOfYear,
    Year
}

Una vez que tengáis implementada vuestra función DateDiff en C#, podéis realizar alguna pequeña prueba comparativa con la función original DateDiff de Visual Basic para verificar que los resultados son los esperados en vuestras operaciones con fechas.

0 30
10
2010

Propiedades autoimplementadas en C#

Sábado, octubre 30th, 2010

A partir de C# 3.0 nos encontramos con una nueva forma de implementar las propiedades de nuestras clases con las propiedades autoimplementadas.

Las propiedades autoimplementadas nos permiten escribir la declaración de la propiedad de forma más concisa y sencilla cuando no es necesaria ninguna lógica adicional en los descriptores de acceso a la propiedad, o en otras palabras, cuando no se requiere personalizar los bloques Set y/o Get.

Para verlo de forma más clara, mostraremos a continuación un ejemplo de la declaración de propiedades clásica, y la declaración de propiedades autoimplementadas:

Sin Propiedades Autoimplementadas

/// <summary>
/// Car class
/// </summary>
public class Car
{

    #region "Attributes"

    /// <summary>Brand car</summary>
    private string brand;
    /// <summary>Model car</summary>
    private string model;
    /// <summary>Vehicle registration plate</summary>
    private string plate;

    #endregion

    #region "Properties"

    /// <summary>Gets & sets the brand of car</summary>
    public string Brand
    {
        get { return brand; }
        set { brand = value; }
    }

    /// <summary>Gets & sets the brand of car</summary>
    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    /// <summary>Vehicle registration plate</summary>
    /// <remarks>read-only property</remarks>
    public string Plate
    {
        get { return plate; }
    }

    #endregion

    /// <summary>Constructor</summary>
    /// <param name="plate"></param>
    public Car(string plate)
    {
        this.plate = plate;
    }
}

En el código anterior, hemos creado una simple clase de ejemplo Car con 3 atributos privados, y sus correspondientes 3 propiedades públicas, siendo la tercera de ellas (platepropiedad de sólo lectura.

Comprobemos a continuación cómo declarar el código con propiedades autoimplementadas sobre la misma clase de ejemplo.

Con Propiedades Autoimplementadas

/// <summary>
/// Car class
/// </summary>
public class Car
{

    #region "Attributes"

    /// <summary>Brand car</summary>
    private string brand;
    /// <summary>Model car</summary>
    private string model;
    /// <summary>Vehicle registration plate</summary>
    private string plate;

    #endregion

    #region "Properties"

    /// <summary>Gets & sets the brand of car</summary>
    public string Brand { get; set; }

    /// <summary>Gets & sets the brand of car</summary>
    public string Model { get; set; }

    /// <summary>Vehicle registration plate</summary>
    /// <remarks>read-only property</remarks>
    public string Plate { get; private set; }

    #endregion

    /// <summary>Constructor</summary>
    /// <param name="plate"></param>
    public Car(string plate)
    {
        this.plate = plate;
    }
}