Problemas con Aplicaciones Web ASP.NET en IIS 7 en 64 Bits??

20 08 2009

Hoy mi compañero de desarrollo Juan Antonio y yo, tuvimos unos problemas de correr una aplicación ASP.NET con Oracle en el IIS 7 usando un servidor de 64 Bits, marcandonos como error que no cargaban algunos assemblies.

Buscando en internet encontramos la solución.

Al parecer aun existe alguna incompatibilidad de ejecutar aplicaciones Web en 64 bits  utilizando el IIS como servidor Web, aparte de instalar todos los componentes de Internet Information Services en Administrar Características de Windows – Programas .

Debemos forzar y decirle al IIS  para habilite la ejecución de aplicaciones de 32 Bits de esta manera:

1. Abra el símbolo del sistema y desplácese hasta el directorio C:\Inetpub\AdminScripts.
2. Escriba el comando siguiente:

   cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 true
3.  Presione ENTER.

* PD: Asegurese que el archivo Adsutil.vbs exista en el directorio, si no existe rectifique que haya seleccionado todas las funciones de instalación de Internet Information Services.

Espero esto sirva como referencia para posteriores consultas, resolviendo aquel detalle que se nos presentó en esta ocasión.

Saludos.





Programando una aplicación ASP.NET con MySQL y .NET

22 07 2009

Desde la conexión hasta la programación es muy fácil, ya que con respecto a ADO.NET no cambia, así que puedo programar con ADO.NET y conectarme a MySQL, Oracle, Access y demás bases de datos. Un modelo para todos.

1.- Acceder a la página de MySQL  y descargar el conector que tiene soporte para Visual Studio 2008 . Yo descargué el 6.0 , existe uno el 6.1 pero aún esta beta. Si desean testear descarguen ese.

URL: http://dev.mysql.com/downloads/connector/net/6.0.html

2.- Deben tener instalado algún servidor, pueden descargar el community server de MySQL, pero si quieren evitar la fatiga de hacer estos pasos como lo muestran en este blog http://www.15seconds.com/issue/050210.htm y están usando el WAMP Server para desarrollar páginas PHP, pueden utilizar ese que ya tiene MySQL incluido.

3.-  Después de tener instalado los 2 componentes anteriores, vamos a realizar de forma gráfica la conexión con Visual Studio 2008, en el explorador de servidores (Server Explorer). Escogemos el recurso de datos como MySQL DataBase.

Hasta este punto debimos crear una base de datos en MySQL y las tablas

MySqlNET_007

 

MySqlNET_004

MySqlNET_005

.

 

4.- Crear un proyecto o sitio web ASP.NET

MySqlNET_001

5.- Programar la clase de Datos.

MySqlNET_003

Importar los siguientes namespaces desde referencias y en código.

MySqlNET_002 

C#

using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;

VB.NET

Imports MySql.Data
Imports MySql.Data.MySqlClient

Quizás esta sea otra forma de programar con ADO.NET, lo adapté a un  estilo de programación reutilizable. Usted puede aplicarlo en la práctica.

 

Método CrearComando().- Este método es reutilizable para poder crear comandos.

C#

public static MySqlCommand CrearComando()
 {
  string _cadenaConexion = " server = localhost; user id = root; database = myCompany";
  MySqlConnection _conexion = new MySqlConnection();
  _conexion.ConnectionString = _cadenaConexion;
  MySqlCommand _comando = _conexion.CreateCommand();
   _comando.CommandType = CommandType.Text;
  return _comando;
 }

VB.NET

Public Shared Function CrearComando() As MySqlCommand
 Dim _cadenaConexion As String = " server = localhost; user id = root; database = myCompany"
 Dim _conexion As New MySqlConnection()
  _conexion.ConnectionString = _cadenaConexion
 Dim _comando As New MySqlCommand()
  _comando = _conexion.CreateCommand()
  _comando.CommandType = CommandType.Text
 Return _comando

    End Function

Método EjecutarComandoSelect(), Este metodo contiene un DataReader que lee todos los registros y carga la información a la tabla con la ayuda del evento ExecuteReader del comando.

C#

public static DataTable EjecutarComandoSelect(MySqlCommand comando)
        {
            DataTable _tabla;
            try
            {
                comando.Connection.Open();
                MySqlDataReader _lector = comando.ExecuteReader();
                _tabla = new DataTable();
                _tabla.Load(_lector);
                _lector.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                comando.Connection.Close();
            }
            return _tabla;
        }

VB.NET

Public Shared Function EjecutarComandoSelect(ByVal comando As MySqlCommand) As DataTable
        Dim _tabla As New DataTable()
        Try
            comando.Connection.Open()
            Dim _lector As MySqlDataReader
            _lector = comando.ExecuteReader
            _tabla.Load(_lector)
            _lector.Close()

        Catch ex As Exception
            Throw ex

        Finally
            comando.Connection.Close()

        End Try

        Return _tabla

    End Function

6.- Programar la clase Seleccionar, en esta clase recibimos una consulta de tipo String y devolvemos los datos en forma de tabla, para posteriormente mostrarlos.

MySqlNET_006

C#

public static DataTable Obtener(string consulta)
 {
    MySqlCommand _comando =Datos.CrearComando();
     _comando.CommandText=consulta;
    return Datos.EjecutarComandoSelect(_comando);
 }

VB.NET

Public Shared Function Obtener(ByVal consulta As String) As DataTable
  Dim _comando As MySqlCommand = Datos.CrearComando()
  _comando.CommandText = consulta
  Return Datos.EjecutarComandoSelect(_comando)
    End Function

7.- Crear una clase o modulo para colocar ahí y separar las consultas.

C#

public class Consultas
    {

        public static string consultarEmpleados="SELECT * FROM Empleados";
    }

VB.NET

Module Consultas

    Public consultarEmpleados = "Select * from Empleados"

End Module

8.- En el sitio web en Default.aspx o la página en donde deseen.

Agregamos un ListView al formulario, el diseño HTML es el mismo para ambos lenguajes.

HTML :

<asp:ListView ID="ListView1" runat="server">
    <LayoutTemplate>
        <asp:PlaceHolder ID="itemPlaceHolder" runat="server"></asp:PlaceHolder>

    </LayoutTemplate>
    <ItemTemplate>
     <br />
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("ID") %>'> </asp:Label> <br />
         <asp:Label ID="Label2" runat="server" Text='<%# Bind("Nombre") %>'> </asp:Label> <br />
          <asp:Label ID="Label3" runat="server" Text='<%# Bind("Salario") %>'> </asp:Label> <br />
    </ItemTemplate>
    <ItemSeparatorTemplate>
    ---------------------------------------

    </ItemSeparatorTemplate>
    </asp:ListView>

El listview debe contar un un LayoutTemplate y en el colocar un PlaceHolder con el ID=”itemPlaceHolder” de otro modo les marcará error.

Dentro del itemTemplate vamos a colocar la información que mostrará, como lo vamos a ligar a la clase Seleccionar entonces utilizamos Bind o podemos ocupar Eval, es cuestión de lo que usteden desean.

En el archivo CodeFile del Default ya sea Default.aspx.cs o Default.aspx.vb

Cargamos la información como datasource del control ListView.

C#

protected void Page_Load(object sender, EventArgs e)
        {
            ListView1.DataSource = Seleccionar.Obtener(Consultas.consultarEmpleados);
            ListView1.DataBind();
        }

VB.NET

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ListView1.DataSource = Seleccionar.Obtener(Consultas.consultarEmpleados)
        ListView1.DataBind()
    End Sub

Resultado:

MySqlNET_008

Que sea de gran utilidad. Saludos.

Descarga del proyecto en C#

Descarga del proyecto en VB.NET





Como cargar un archivo de Excel a ASP.NET de forma dinámica en VB.

17 07 2009

He creado una clase de carga de archivos de tipo Excel 2007

Public Shared Function ChecarExtension(ByVal extension As String) As Boolean

        Select Case extension.ToLower()
            Case ".xlsx"
                Return True
            Case Else
                Return False
        End Select

    End Function

Crear una función para que solo acepte archivos con extensión .xlsx

La siguiente función es cargar el archivo, yo le he agregado de checar si existe antes algun archivo que se haya cargado en la carpeta para que lo elimine y pueda cargar el nuevo archivo.

Public Shared Sub Cargar(ByVal archivo As FileUpload, ByVal instancia As HttpRequest, ByVal tabla As GridView)
        Dim _carpeta As String = "Recursos\Archivos\"
        Dim _directorioGral As String = instancia.PhysicalApplicationPath

        Try
            If archivo.HasFile Then
                Dim _extension As String = Path.GetExtension(archivo.FileName)
                If ChecarExtension(_extension) Then
                    Dim _directorioParaGuardar As String = _directorioGral + _carpeta + archivo.FileName
                    '----------------------Eliminar Archivos Existentes------------------------------
                    EliminarArchivos(instancia)

                    '-----------------------Guardar nuevo archivo------------------------------
                    archivo.SaveAs(_directorioParaGuardar)

                    tabla.DataSource = MostrarExcel(_directorioParaGuardar)
                    tabla.DataBind()

                End If

            Else

            End If
        Catch ex As Exception
            Throw New Excepciones("Error al cargar el archivo ", ex)
        End Try

    End Sub

He aquí el metodo de eliminar los archivos que mando a llamar en la función anterior.

 Public Shared Sub EliminarArchivos(ByVal instancia As HttpRequest)

        Dim _carpeta As String = "\Recursos\Archivos\"
        Dim _directorioGral As String = instancia.PhysicalApplicationPath + _carpeta

        Dim directorio As New DirectoryInfo(_directorioGral)
        Dim archivos As FileInfo() = directorio.GetFiles()
        Dim archivo As FileInfo

        For Each archivo In archivos
            archivo.Delete()
        Next

    End Sub

Como se han de ver dado cuenta en la función de carga, mando a llamar un método de mostrarExcel.

Esta función se conecta al archivo como recurso de datos y extrae la información para mostrarla en un GridView, de la siguiente manera:

 Public Shared Function MostrarExcel(ByVal ruta As String) As DataTable

        Dim _cadenaconexion As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0", ruta)
        Dim _oledbConn As New OleDbConnection(_cadenaconexion)
        Dim dt As New DataTable()

        Try
            _oledbConn.Open()
            Dim _cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [Sheet1$]", _oledbConn)
            Dim _oleda As OleDbDataAdapter = New OleDbDataAdapter()
            _oleda.SelectCommand = _cmd

            _oleda.Fill(dt)

            _oleda.Dispose()
            _cmd.Dispose()
        Catch ex As Exception

        Finally

            _oledbConn.Close()
            _oledbConn.Dispose()
        End Try
        Return dt
    End Function

He agregado un control de tipo FileUpload, un botón y un gridview para hacer la prueba.

Dentro del botón mandamos a llamar el método de cargar el archivo.

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        CargarArchivos.Cargar(FileUpload1, Me.Request, Me.GridView1)
    End Sub

Resultado final:

cargarArchivoExcelconVBenASPNET

Espero les sirva de utilidad.





Curso: Desarrollando Sitios Web Seguros

9 06 2009

proxOnlineCourse





Como redireccionar de http a https en C#

30 05 2009

Si están buscando como cambiar de http a https y viceversa de https a http, aquí les dejo un código que me ha funcionado.

public partial class Default : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
//Llamando al método true= https; false = http;
        protocoloSeguro(true);
    }

//Metodo de redireccionamiento..
    public void protocoloSeguro(bool bSeguro)
    {

        string redirectUrl = null;

        if (bSeguro && !Request.IsSecureConnection) redirectUrl = Request.Url.ToString().Replace("http:", "https:");
        else
            if (!bSeguro && Request.IsSecureConnection) redirectUrl = Request.Url.ToString().Replace("https:", "http:");

        if (redirectUrl != null)
            Response.Redirect(redirectUrl);

    }
}

https001

https002





Errores comunes en ASP.NET Chart Controls

29 05 2009

Actualmente estoy desarrollando una aplicación web y estoy manejando gráficas usando el control Chart de ASP.NET.

He tenido algunos errores al principio :

 

1.-Invalid temp directory in chart handler configuration [c:\TempImageFiles\].

charterror_01

Bueno esto pasa cuando agregamos un control o gráfica a nuestro formulario, automáticamente en nuestro Web.Config no hemos visto pero se ha creado un linea dentro de los tags AppSettings como lo podemos ver a continuación:

<add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />

Tan solo vamos a eliminar el directorio que nos muestra.

 

  <add key="ChartImageHandler" value="storage=file;timeout=20;" />

Y listo :) .

 

2.-The temp directory in chart handler configuration is not accessible [C:\inetpub\wwwroot\NombreProyecto\].

 

charterror_02

Simplemente con darle permisos a la carpeta de escribir quedará.

charterror_03

:) Saludos…





Arquitectura de una aplicación ASP.NET sencilla.

12 05 2009

Para una aplicación web que no espera cientos de usuarios concurrentes, pueden ocupar esta arquitectura, en donde todos los componentes son tipos manejados. Las páginas ASP.NET utilizan controles estandares construidos en el Framework que generan HTML según la W3C. Esto permite que la aplicación web pueda ser vista en distintas plataformas o sistemas operativos que soporten algún navegador web.

Esta arquitectura utiliza capa de lógica de negocios, en donde se comunica con la de acceso a datos utilizando el Data Access Aplication Block que es una clase de la Enterprise Library que contiene métodos para acceder a los datos  y llamando a procedimientos almacenados.

Recomiendo mucho esta arquitectura para sus aplicaciones.

ArquitecturaASPNET_Website

Saludos.





Manejar ASP.NET Themes dinámicamente

29 04 2009

Tal vez este sea uno de los post más buscados, por lo menos yo batallé en su momento.

Chequemos los archivos que utilizaremos:

  • Dos temas : Black y Blue con sus respectivas hojas de estilo CSS
  • Una MasterPage y un ContenPage (WebForm), dentro del formulario un DropDownList.
  • Un archivo Global.asax

ThemesASPNET_001

Dentro de un archivo Web.Config agregaremos un tag <anonymousIdentification>, <profile> y dentro del profile <properties> Tema y Master.

<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <connectionStrings/>
    <system.web>
        <compilation debug="true">
        </compilation>
        <anonymousIdentification enabled="true"/>
        <profile enabled="true">
            <properties>
                <add name="Tema" allowAnonymous="true"/>
                <add name="Master" allowAnonymous="true"/>
            </properties>
        </profile>
        <authentication mode="Windows"/>
    </system.web>
</configuration>

En el método Page_Load vamos a colocar este código, en donde tenemos un array de tipo string que almacenará todos los temas que tengamos en la carpeta “App_Themes”, después ese array pasará como recurso de datos al DropDownList para mostrarlo en el formulario Web.

protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {

            string[] nombretemas;
            DirectoryInfo directorio;

            nombretemas=Directory.GetDirectories(Server.MapPath("App_Themes"));

            for (int i = 0; i < nombretemas.Length; i++){    

                directorio = new DirectoryInfo(nombretemas[i]);
                nombretemas[i]=directorio.Name;
                }

            DropDownList1.DataSource = nombretemas;
            DropDownList1.DataBind();
            DropDownList1.SelectedValue = Profile.Tema;
        }
    }

En el archivo Global.asax vamos a agregamos un método llamado Application_PreRequestHandlerExecute, de acuerdo al postback que hagamos al seleccionar el tema, este aplicará el tema del perfil (profile).

Guardando el tema para la siguiente vez que entre a la página.

<%@ Application Language="C#" %>

<script runat="server">
    void Application_Start(object sender, EventArgs e)
    {
    }

    void Application_End(object sender, EventArgs e)
    {
    }

    void Application_Error(object sender, EventArgs e)
    {
    }

    void Session_Start(object sender, EventArgs e)
    {
    }

    void Session_End(object sender, EventArgs e)
    {
    }
    void Application_PreRequestHandlerExecute(object sender,EventArgs e)
    {
        Page p= HttpContext.Current.Handler as Page;
        if(p!=null)
        {
            ProfileCommon pc= (ProfileCommon)HttpContext.Current.Profile;
            if(pc!=null){
            p.Theme=pc.Tema;
            //p.MasterPageFile=String.Format("~/{0}.master",pc.Master);
            }
        }
    }
</script>

ASPThemes_0000001

ASPThemes_0000002

Descarga el ejemplo:

URL: ASPNET_Themes.zip-download