Está en la página 1de 27

1

Fundamentos de las aplicaciones ASP.NET MVC


Este curso se enfoca principalmente en la descripcin del entorno de ejecucin de las aplicaciones ASP.NET MVC describiendo la relacin entre el servidor Web Internet Information Services y ASP.NET. Se describe la diferencia entre el desarrollo de aplicaciones Web utilizando ASP.NET Web Forms y ASP.NET MVC y se proporcionan al participante los conocimientos necesarios para entender la estructura de una aplicacin ASP.NET MVC sin profundizar en el desarrollo de la misma. Audiencia El contenido de este curso esta enfocado en 2 tipos de audiencia: Desarrolladores y Administradores Web Los desarrolladores tendrn la oportunidad de conocer el entorno de ejecucin de las aplicaciones ASP.NET as como las principales tareas que un administrador debe realizar para instalar una aplicacin ASP.NET en el servidor Web. Los administradores Web, tendrn la oportunidad de conocer el funcionamiento de las Aplicaciones ASP.NET para poder dar soporte en la instalacin y configuracin de las mismas. Objetivos Al finalizar este curso los participantes contarn con los conocimientos y habilidades para:

Describir las principales caractersticas del servidor Web IIS Describir el entorno de ejecucin de las aplicaciones ASP.NET Extender la funcionalidad del servidor Web IIS mediante HTTP Handlers y HTTP Modules Describir la arquitectura de enrutamiento de ASP.NET Describir la estructura de las aplicaciones ASP.NET MVC Seleccionar la tecnologa apropiada entre ASP.NET Web Forms y ASP.NET MVC para el desarrollo de aplicaciones Web Configurar el servidor Web IIS para permitir publicaciones de aplicaciones desde Visual Studio

Requerimientos

Equipo de desarrollo con Windows 7 Equipo de pruebas con Windows 2008 (Puede ser una mquina virtual) Visual Studio 2010 Ultimate Contenido del curso

Mdulo 1: Internet Information Services 7

Leccin 1: Introduccin o Qu es Internet Information Services? o Versiones de IIS o Instalando IIS en Windows Server 2008 o Instalando el servicio DNS para resolver nombres de dominios Leccin 2: Caractersticas principales del IIS 7 o Administracin modular o Arquitectura modular o Nuevo almacn de configuracin Leccin 3: Sitios Web o El Sitio Web predeterminado o Creacin de nuevos Sitios Web o Directorios Virtuales o Aplicaciones Web Leccin 4: Application Pools o El proceso de trabajo del IIS (IIS Worker Process) o Qu es un Application Pool? o Beneficios de los Application Pools o Modos de ejecucin de los Application Pools

2
o o
Creando Application Pools Comparando los modos Integrated y Classic

Mdulo 2: El entorno de ejecucin de las aplicaciones ASP.NET

Leccin 1: ASP.NET y el Servidor Web IIS o Integracin entre IIS y ASP.NET o Manejo de las peticiones HTTP Leccin 2: Extendiendo la funcionalidad del Servidor Web IIS o Extensiones y Filtros ISAPI (Internet Server Application Programming Interface) o Creando un controlador HTTP (HTTP Handler) o Creando un mdulo HTTP (HTTP Module)

Mdulo 3: ASP.NET Routing

Leccin 1: Introduccin a ASP.NET Routing o Qu es ASP.NET Routing? Leccin 2: Implementado ASP.NET Routing o La funcin del controlador de Ruta o Patrones URL o Pasando datos al controlador de la Ruta o Utilizando una pgina .aspx como controlador de Ruta o Estableciendo valores predeterminados para los parmetros del URL o Conflictos por Rutas similares o Controlando un nmero variable de segmentos en un patrn URL o Agregando restricciones a las Rutas o Escenarios de cuando el enrutamiento no es aplicado

Mdulo 4: El Framework ASP.NET MVC

Leccin 1: Introduccin al Framework ASP.NET MVC o ASP.NET antes y despus del .NET Framework 3.5 SP1 o ASP.NET Web Forms o Qu es el Framework ASP.NET MVC? Leccin 2: El ciclo de vida de una Peticin o El ciclo de vida de una peticin Web Forms o El ciclo de vida de una peticin MVC o Peticiones Web Forms Vs Peticiones MVC o Web Forms Vs MVC

Mdulo 5: La estructura de una aplicacin MVC

Leccin 1: Creando una aplicacin ASP.NET MVC o Creando un proyecto ASP.NET MVC Web Application o Explorando la estructura de la solucin o Ejecutando la aplicacin Leccin 2: Creando un controlador o Agregando una nueva clase para el controlador o Modificando las Acciones del Controlador o Ejecutando la aplicacin Leccin 3: Pasando parmetros al Controlador o Pasando parmetros por QueryString o Pasando parmetros incrustados en el URL Leccin 4: Creando una Vista o Agregando una Pgina Maestra o Agregando hojas de estilo o Agregando la Vista o Ejecutando la aplicacin Leccin 5: Creando el Modelo para la Vista

3
o o o o
Creando una Clase para pasar datos a la Vista Utilizando la Clase desde el Controlador Creando la Vista que utilice la Clase Utilizando la Clase en la Vista

Leccin 6: Utilizando parmetros en la Vista o Creando Clases Modelo o Utilizando las Clases desde el Controlador o Creando la Vista que utilice la Clase o Utilizando la Clase en la Vista o Agregando Links entre pginas o Pasando valores a la vista mediante la Clase ViewBag o Publicando la aplicacin al servidor Web IIS

==========SQL KED========== http://www.ked.com.mx/SQLOnline/SitePages/sesiones.aspx ============ CURSO DIPLOMADO IT https://skydrive.live.com/view.aspx/Datos%20para%20el%20curso.xlsx? cid=b09638b21ef411b7&Bsrc=Share&Bpub=SDX.SkyDrive&app=Excel ========================= CUENTA DREAMSPARK Instructor.sisco@gmail.com Laclasica$ CODIGO = 5LLOC-WERCY-7WYWW-MALRB-O8UUO ========================== SESION 8 CODIGO MIXTO CODIGO INLINE CODE BEHIND JIT COMPILER Cuando una pgina est habilitada con JIT compiler, la primera vez el cdigo de las paginas son compiladas, a `partir de la segunda peticin se ejecutan directamente las paginas compiladas

AGREGAR EVENTOS A CONTROLES Existen 2 DEL LADO DEL SERVIDOR (Estos son ms poderosos) DEL LADO DEL CLIENTE => esto se puede usar por ejemplo para validacin de datos en un Textbox antes de pasarlo al servidor y este pueda procesar buena informacin y no basura

SESION 9 EVENTOS DE PAGINAS POSTBACK=> envio de datos de regreso hacia el servidor CROSPOSTBACK => Mandar datos a otra pagina AUTOPOSTBACK Ciclo de vida de la pagina Cuando una pgina web es requerida hasta que se le entrega al usuario se generan varios eventos. Pero la pgina se crea y se destruye

Cuando un usuario pide una pgina SAP.NET se determina si se debe de compilar o si se encuentra en cache se enva una versin en cache como respuesta sin necesidad de enviar la pagina En el caso de inicio se establecen por ej: REQUEST-> requerimiento por parte del usuario en esta fase la pgina determina si la solicitud es una devolucin de datos un Postback o una nueva solicitud que sera la primera vez RESPONSE->la respuesta del servidor Ispostback vale true cuando se solicita la pagina con una devolucin de datos

GLOBALIZAR PAGINAS-> significa si el explorador del cliente est en qu idioma entonces ASP.NET enva como respuesta toda la informacin en ese idiomas Es la tpica bandera que cambia de idioma la pagina Esto se debera realizar en la FASE DE INICIO-> Cambio de Idiomas FASE DE INICIALIZACION DE LA PAGINA -> aqu se inicializan los controles a partir del identificador de cada control (ID) FASE DE CARGA-> Los controles se cargan con la configuracin del VIEW STATE FASE DE VALIDACION-> Se utilizan controles de validacin CONTROL DE EVENTOS->Aqu se realiza un PostBack() FASE DE RENDERING (REPRESENTACION)-> la pagina llama al mtodo render de cada control y este tiene la funcin de generar el cdigo que se le enviara al cliente Page_PreInit => este se utiliza para determinar si es la primera vez que se utiliza la pgina, Para establecer una pgina maestra de forma dinmica Aqu tambin se establece el Theme (Mascaras, colores, Skin) , aqu tambin se establecen los perfiles En esta fase el VIEW STATE no est listo no funciona no se puede recuperar los datos Page_Init=> Este se ejecuta cuando todos los controles se han inicializado y se aplica los Skins de cada uno de los controles y aqu podemos inicializar las propiedades de los controles

5
Page_InitComplete=> Este es convocado por el Page para verificar que el proceso del init fue finalizado con exito Page_PreLoad=>Aqu es donde se establece el ViewState, aqu tambin se realiza el procesamiento de la pagina y del PostBack Page_Load=> Page_LoadComplete=> Page_PreRender=> Estos son los eventos que mas se utilizan

RESOLVIENDO PROBLEMAS EN TIEMPO DE EJECUCION Qu es tracing? Es el proceso de recibir mensajes informativos en tiempo de ejecucin mientras se esta ejecutando nuestra aplicacin QUE TIPO DE INFORMACION SE PUEDE RECOPILAR Podemos examinar el valor de las variables Podemos determinar si ciertas condiciones se cumplen podemos utilizar el objeto trace Podemos depurara y seguir la ruta de ejecucin de nuestra de aplicacin y cuando se alcance el punto de ruptura nosotros podemos empezar a trazar podemos depurar nuestra aplicacin

OBJETO PARA RECOPILAR INFORMACION EN TIEMPO DE EJECUCION

TRACE=> Nos muestra informacin en una pgina web o salvarla en la memoria. Le podemos decir que nos muestre en la pagina o en la memoria mientras esta en memoria le podemos pedir que nos muestre La ventaja de usar trace es que cuando distribuyamos nuestra aplicacin podemos fcilmente quitar el trace Y NO como lo hace el response tener que estar quitando los Response.Write en todo lugar EL TRACE EXISTE A NIVEL DE PAGINA => Todos los mensajes se adicionan al final de la pagina EL TRACE EXISTE A NIVEL DE APLICACION

DEBUG=> Esto se usa para depurar la aplicacin y este corre cuando compilamos la aplicacin y adems la primera vez que corremos la aplicacin Vamos realizando ejercicion de depuracin de cdigo con F11=>realizar un trazado lnea por lnea F10=>realizar un trazado de golpe sin que ingrese por ejemplo a los mtodos Shift + F11 => esto es para que se ejecute todo el cdigo d golpe hasta donde este el cursor Para poder utilizar esto debemos importar el NameSpace System.Diagnostic protected void Button1_Click(object sender, EventArgs e) {

6
Label1.Text = saluda(); Debug.Write("ESTOY EN EL CODIGO DEL BOTON"); } Para poder ver este mensaje del DEBUG primero debemos habilitar la ventana de resultados del men VIEW (Si esta en INGLES es output) Luego de pinchar en el botn y en esta ventana de OUTPUT nos muestra el mensaje

EJEMPLO DE TRACE La informacin puede quedar en la pagina o en la memoria En este primer ejemplo no muestra nada en la pagina entonces seguramente esta en memoria protected void Button1_Click(object sender, EventArgs e) { Label1.Text = saluda(); } Trace.Write("TRACE: Estoy en el boton pero con trace");

string saluda() { Trace.Write("ESTOY EN EL METODO SALUDAR"); return "HOLA DESDE EL PROC"; }

Si queremos que nos muestre en la pagina debemos de ir al cdigo HTML de la pagina y en la parte de directivas arriba adicionamos como atributo Trace=true 123AHORA SI EL TRACE.WRITE cambiamos por TRACE.WARN nos mostrara los mensajes en ROJO protected void Button1_Click(object sender, EventArgs e) { Label1.Text = saluda(); } Trace.Warn("TRACE: Estoy en el boton pero con trace"); Nos muestra informacin en la parte inferior de la pagina Si presionamos el botn podemos los mensajes que colocamos

string saluda() { Trace.Warn("ESTOY EN EL METODO SALUDAR"); return "HOLA DESDE EL PROC"; } Hasta el momento este trace se lo aplico a nivel de pagina pero lo podemos realizar a nivel de aplicacin esto se lo hace en el WEB.CONFIG->DENTRO DE SYSTEM.WEB -> AL CERRAR EL COMPILATION colocamos <trace enabled=true> <system.web> <trace enabled="true" pageOutput="true"/> </system.web> Ahora si no usamos este atributo pageOutput="true" NO FUNCIONA Porque por defecto esta en false y no se vera en la pagina AHORA si por defecto esta en FALSE el pageOutput pero el TRACE esta habilitado entonces donde se muestra el RESULTADO??

7
Bueno pues los resultados estn en MEMORIA y Podemos acceder a travs de la pgina virtual trace.axd que lo adicionamos al final de la ruta en la barra de direcciones de la pagina Ahora podemos publicar nuestra aplicacin Clik derecho sobre la aplicacin al lado derecho -> publicar aplicacin En la nueva ventana colocamos http://nombre_server_remoto/m05Demo1 y tambien limpiamos el checkbox para que lo precompile y no me deje actualizar Bueno ahora me pide credenciales del host que tiene IIS Ahora si empieza a realizar la publicacin del web site Si vemos en el Default Web Site -> se crea la carpeta con el icono de rodamiento y LISTO. Ahora podemos ir probando la aplicacin desde varios lugares y podemos ver que desaparece el TRACE Vamos al VS.NET y en el web.config agregamos <system.web> <trace enabled="true" pageOutput="true" localOnly=true/> </system.web> Volvemos a ejecutar nuestra aplicacin desde el VS.NET y funciona todo y muestra el TRACE. Lo volvemos a publicar en IIS con este cambio incluido Solo debera mostrar informacin del TRACE en nuestra aplicacin cuando lo ejecutemos desde el SERVER DEL IIS Pero si lo hacemos desde cualquier otro lado no debera mostrar el TRACE AHORA ALGO QUE NOTAR EL MAXIMO NUMERO DE EVENTOS QUE REGISTRA EL TRACE ES 10

AHORA SI TUVIERAMOS CONFIGURADO DE ESTA FORMA EL TRACE pageOutput="true" Nos mostraria el trace en la pgina pero si llegamos a utilizar los 10 eventos que estan permitidos el TRACE EN LA PAGINA DESAPARECE

Bueno si cerramos la pgina y lo volvemos a ejecutar no nos muestra el TRACE porque sigue siendo 10 y ya llegamos al limite

Ahora podemos volver a tener los 10 eventos siempre y cuando detengamos el SERVER DEVELOPMENT DE ASP.NET Ahora si yo quisiera ver los ultimos 10 del TRACE en el web.config adicionamos Esto nos permite guardar lo ultimo <trace enabled="true" pageOutput="true" localOnly=true mostRecent=true/> Ahora si quisiramos tener ms de 10 eventos TRACE adicionamos esto en Web.config requestLimit=20 EL LIMITE ES DE 10000

Si publicamos la aplicacin en IIS Si lo ejecutamos desde cualquier lado NO se muestra el Trace En el IIS si lo hacemos correr SI nos muestra el Trace

8
Ahora si en el IIS colocamos en la URL / trace.axd SI podemos ver el trace en memoria Pero si desde cualquier otro lugar colocamos en la URL / trace.axd este no se puede ver incluso nos manda un mensaje de error que no se puede ejecutar y que solo lo pude hacer de manera local es decir desde el IIS Ahora si quisiramos ver de manera remota el Trace debemos de colocar el LocalOnly=false Esto lo realizamos de la siguiente manera C:\InetPub\wwwroot\aplicacion\ y abrimos el WEB.CONFIG buscamos el trace y editamos el localOnly=false Entonces si volvemos a ejecutar y colocamos en la URL / trace.axd este SI SE PUEDE VER

PARA PODER MONITOREAR PODEMOS EJECUTAR LA APLICACIN DESDE CUALQUIER MAQUINA y NOSOTROS PODEMOS ABRIR EL TRACE.AXD EN EL IIS Y AH PODEMOS ESTAR OBSERVANDO LOS DETALLES DEL TRACE QUIEN SE CONECTO Y QUE ESTA HACIENDO QUE DATOS NOS DIERON, LA IP etc.. OTRA DE LAS COSAS QUE PODEMOS HACER CON EL TRACE ES: HABILITAR EL TRACE POR CODIGO If(! Trace.IsEnable) { Trace.IsEnable=true }

AHORA si yo quisiera realizar el TRACE desde componentes es decir por ejemplo desde alguna clase PRIMERO DEBEMOS IMPORTAR EL NAMAESPACE System.Web Si queremos habilitar el trace para todos los mtodos de la clase lo tenemos que hacer a nivel del constructor y tambin determinar cul es la pgina sobre la cual est corriendo nuestro componente (Como se hace esto?) HttpContext.Current.Trace.IsEnable =true //Con esto se activa el trace a nivel de componente en el constructor de la clase

DEPURACION REMOTA

Permite depurar una aplicacin WEB que se encuentra instalada en un servidor distinto a la computadora de desarrollo Se utiliza la herramienta REMOTE DEBUGGING MONITOR para realizar una depuracin remota es una aplicacin pequea sobre el cual VS.NET se va conectar con esta herramienta que est en el IIS o tal vez podemos compartir una carpeta en el IIS donde este la herramienta de DEBUG Se podra configurar como servicio para que corra en Background, pero no es recomendable por seguridad Se recomienda para que todo funcione correctamente que tanto la PC de desarrollo como el SERVIDOR WEB IIS deben pertenecer a un DOMINIO DE ACTIVE DIRECTORY PUBLICAR DESDE WINDOWS 7 AL IIS DE WINDOWS SERVER 2003

9
PRIMERO: Crear una carpeta compartida en IIS en la siguiente ruta c:\inetpub\wwwroot\devs y le damos permisos a un usuario creado anticipadamente, este usuario debe ser el mismo en ambos lados. Para acceder a la carpeta compartida desde Win 7 a W2003 hacemos esto: Lo que deben hacer es desde la pc con Windows 7 ingresar a: HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaLMCompatibilityLevel to 1. y realizar la modificacion a 1, en caso de no tener ese campo pueden crearlo, el mismo debe de ser de tipo DWord, el nombre : LMCompatibilityLevel y el valor 1

finalmente verificamos desde win 7 en ejecutar -> \\dc-01 y vemos la carpeta DEVS Cuando instalamos el IIS debemos instalar tambin las extensiones FRONTPAGE 2002 PASOS PARA REALIZAR LA DEPURACION REMOTA Habilitar el DEBUG en la aplicacin ASP.NET Instalar Remote Debug Monitor en el Servidor remoto Establecer seguridad para depuracin remota Iniciar la depuracin desde la computadora de desarrollo BIEN lo que realizaremos ahora es lo siguiente: PODEMOS HABILITAR EL OUTPUT EN VS.NET PARA VER COMO LO VA PUBLICANDO EN EL IIS PRIMERO VAMOS A PUBLICAR SIN SELECCIONAR LA OPCION EMITIR INFORMACION DE DEPURACION Luego vemos en el IIS nuestra aplicacin publicada ingresamos al directorio BIN y podemos ver que no existen archivos con extension PDB

AHORA DEBEMOS Publicar la aplicacin en IIS seleccionando la opcin EMITIR INFORMACION DE DEPURACION Luego vemos en el IIS nuestra aplicacin publicada ingresamos al directorio BIN y podemos ver que AHORA SI existen archivos con extensin PDB DEBEMOS INSTALAR EL WIC_x86_esn.exe ANTES DEL FRAMEWORK 4.0 DEBEMOS INSTALAR EL NET FRAMEWORK 4.0 EN WINDOWS 2003 ES IMPORTANTE RECORDAR QUE DEBEMOS REGISTRAR EL ASP.NET 4.0 EN EL IIS DEL WINDOWS SERVER 2003 Una vez que publicamos podemos probar de la siguiente forma: Podemos cometer errores de ingreso de datos como los textbox no estn validados para que solo acepte enteros entones podemos colocar KILOMETROS=350Kms o algo asi

Esto provocara una excepcin que nosotros podemos recoger Entonces primero importamos el NamSpace system.Diagnostic Try{} catch (Exception ex) {

10
Debug.WriteLine(""); Debug.WriteLine(string.Format("IP:{0}",Request.UserHostAddress)); Debug.WriteLine(string.Format("Kilometros Recorridos:{0}", TextBox1.Text)); Debug.WriteLine(string.Format("Tiempo Recorrido:{0}", TextBox2.Text)); Debug.WriteLine(ex.Message); }

Si probamos esto de manera local dando errores de entrada podemos ver como en la depuracin nos muestra la IP del cliente y los datos que introducimos de manera remota COMO SE REALIZA DEPURACION REMOTA ? Primero debemos identificar el proceso que ejecuta nuestra aplicacin en el servidor WEB Entonces cuando ejecutamos nuestra aplicacin en IIS -> Abrimos el administrador de Tareas Y buscamos el proceso que hace correr nuestra aplicacin generalmente se llama NETWORK SERVICES A este proceso le tenemos que hacer un debug REMOTO Entonces nos vamos a la maquina que tiene VS.NET e ingresamos C:\ProgramFiles\Microsoft Visula Studio 9\Common 7\IDE\Remote Debuger\x86 y ah se encuentra msvsmon.exe Podramos compartir esta carpeta x86 y desde el IIS vemos esta carpeta y podramos ejecutar Entonces ejecutamos la aplicacin msvsmon.exe y vemos que est esperando conexiones Entonces ahora tenemos que tener en ambas maquinas tanto de VS como el de IIS El mismo usuario con la misma contrasea en mi caso Marbel Entonces en el programa msvsmon.exe nos vamos a tools -> Permisos Vemos que solo el administrador tiene permisos entonces adicionamos a Marbel para que tambin pueda depurar Otra cosa importante es que el usuario administrador debe existir en ambas maquinas con el mismo password Algo importante es que debemos haber INICIADO SESION CON EL MISMO USUARIO Y LA MISMA CONTRAEA EN AMBAS MAQUINAS Ahora nos vamos al VS.NET -> TOOLS-> ATACH TO PROCESS En esta ventana colocamos el mismo usuario con el que hemos iniciado sesin en ambas maquinas (En este caso Marbel@DC-01 ) Todo fue correcto y ahora buscamos el proceso W3WP.exe y le decimos ATTACH Bueno ahora desde la misma pc de VS.NET abrimos IE y accedemos a nuestra aplicacin que est en el IIS de esta forma http://192.168.166.71/devs/MS0502/ W3WP.exe

Y lo hacemos correr con datos buenos y vemos que en el DEBUG no pasa nada porque los datos fueron correctos Ahora probamos con datos MALOS Y VEMOS que pasa en el DEBUG

CAPITULO 13

11
CONTROLES DE VALIDACION --------- ESTO ESTA LISTO YA LO SE ---------------CAPITULO 14 CONTROLES DE USUARIO Podemos crear controles y encapsularlos en DLL podemos reutilizar en otras aplicacin este tipo de controles que encapsulamos en DLL y distribuirlo a otras aplicaciones sin dar nuestro cdigo fuente son Controles de usuario Personalizados Existen otros controles que se llaman controles de usuario WEB que son archivos HTML que se reutilizan en la misma aplicacin. Si yo quisiera utilizar estos controles en otra aplicacin debemos copiar el archivo HTML hacia la otra aplicacin La diferencia con los primeros es que los primeros los compilo en un DLL y le envio a la otra aplicacin sin exponer mi cdigo fuente, en cambio estos ltimos necesariamente debo copiar el HTML y entonces exponer el cdigo fuente Click derecho en el proyecto->Adicionar nuevo Item->WEB USER CONTROL Estos llevan la extensin ASCX le damos en nombre encabezado.ascx al igual que los webform podemos tener el codebehind Estos no tienen directiva PAGE sino mas bien tiene directiva CONTROL Entonces como ya tenamos la pagina default con diseo copiamos y lo pegamos en el archivo ASCX Ahora nos vamos a la primera pagina que se llama DEFAULT.ASPX y SOLO JALAMOS EL ARCHIVO ASCX A LA PARTE SUPERIOR DE DAFAULT.ASPX ya podemos ver el encabezado Bien ahora nos vamos al cdigo HTML de la pagina default y vemos que se agrego En la parte superior se agrego

Ahora nos vamos a la pgina PAISES y hacemos lo mismo arrastrar y soltar el ASCX Qu tal si ahora nos vamos al archivo ASCX y lo cambiamos de imagen y adicionamos textos. Si nos vamos a las pginas donde hemos jalado este control de usuario y podemos ver como tambin aqu cambio La diferencia con las pginas maestras (que sirven como plantilla) es que estos controles de usuario sirven como pedazos de pgina, que nosotros podemos ubicar en cualquier parte de nuestra aplicacin. Si queremos reutilizar este control de usuario en otros proyectos lo que debemos hacer es copiar este archivo .ASCX al nuevo proyecto para reutilizarlo

APLICACIONES EN CAPAS

12
ESTO ES UNA FORMA

La capa de presentacion puede hacer referencia a la capa de logica, pero NUNCA hace referencia a la capa de acceso a datos por que eso viola el modelo por capas Ahora la capa de acceso a datos por norma nunca hace referencia ni a la capa de lgica y mucho menos a la capa de presentacin Las 2 primeras capas hacen referencia a la capa de acceso a datos, pero esta capa nunca hace referencia a las otras OTRA FORMA ES MEDIANTE EL USO DE ENTIDADES Es decir en lugar de que yo le pase correo,password,nombre,apellido Mejor encapsulamos todo esto, es decir podemos crear una entidad por ejemplo llamada USUARIO-> Esta entidad va contener cada uno de los datos del usuario (que son propiedades) Ahora esta entidad la va ocupar cada una de las Capas (Acceso a Datos,Logica,Presentacion) Pero el problema es en que capa tenemos que definir la entidad del USUARIO Por ejemplo si lo definimos en la capa de acceso a datos la capa de presentacin no podr acceder Ahora si lo definimos en la capa de lgica la de acceso a datos tampoco puede acceder Entonces lo que podemos hacer es definir una cuarta capa que se denomina CAPA COMUN y aqu es donde podemos crear nuestra entidad USUARIO Esta es una CAPA COMUN porque las capas 1 2 3 podrn agregar una referencia a esta capa, esta capa simplemente es utilizada por las otras capas EJEMPLO 1. 2. 3. Primero creamos una solucin vacia Adicionamos un website de nombre PRESENTACION Adicionamos un ClassLibrary de nombre ACCESO A DATOS

13
4. Adicionamos un ClassLibrary de nombre ACCESO LOGICO

Ahora vamos haciendo referencia de la siguiente forma La capa comn nunca crea referencia a las otras capas En la capa de ACCEOS A DATOS adicionamos una referencia a la capa COMUN En la capa de LOGICA DE NEGOCIO adicionamos una referencia a la capa COMUN y ACCESO A DATOS En la capa de PRESENTACION adicionamos una referencia a la capa COMUN y a la capa LOGICA DE NEGOCIO

Ahora creamos una clase con nombre PAIS dentro de la capa COMUN y con este cdigo namespace Comun { public class Pais { public int Id { get; set; } public string Nombre { get; set; } public Pais(int pID, string pNombre) { this.Id = pID; this.Nombre = pNombre; } public Pais() { }

} }

COMENZAMOS CON EL INSERTAR


Ahora creamos una clase con nombre ABM dentro de la capa AccesoDatos y con este cdigo namespace AccesoDatos { public class ABM { public bool InsertaPais(Comun.Pais p) { bool resultado = false; string cadena ="Data Source=.;Initial Catalog=SVTP;Integrated Security=true"; SqlConnection con = new SqlConnection(cadena); con.Open(); SqlCommand command = con.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText ="insert into T_Paises(Id,Nombre) values(@COD,@NOM)"; command.Parameters.AddWithValue("@COD",p.Id); command.Parameters.AddWithValue("@NOM",p.Nombre); int fila = command.ExecuteNonQuery(); if(fila == 1) { resultado = true; } con.Close(); con.Dispose(); command.Dispose(); return resultado;

14

} } }

Nos vamos a la capa de LOGICA y adicionamos la clase LABM y adicionamos lo siguiente namespace Logica { public class LABM { public bool LInserta(Comun.Pais p) { bool resultado = false; if (p.Id != null) { if (p.Id > 0) { if (!string.IsNullOrEmpty(p.Nombre)) { AccesoDatos.ABM datos = new AccesoDatos.ABM(); resultado=datos.InsertaPais(p); } } } return resultado; } } }

Finalmente vamos a la capa presentacin y agregamos el siguiente cdigo en el BOTON INSERTAR protected void Button1_Click(object sender, EventArgs e) { Logica.LABM obj = new Logica.LABM(); Comun.Pais p = new Comun.Pais(int.Parse(txtID.Text),txtNombre.Text); bool resultado=obj.LInserta(p); if (resultado) { lblReporte.Text = "REGISTRO INSERTADO...."; } else { lblReporte.Text = "ERROR AL INSERTAR...."; }

AHORA VAMOS CON EL LISTADO


En la capa de Acceso a Datos

15
public List<Comun.Pais> MostrarPaises() { List<Comun.Pais> lista = new List<Comun.Pais>(); string cadena = "Data Source=.;Initial Catalog=SVTP;Integrated Security=true"; SqlConnection con = new SqlConnection(cadena); con.Open(); SqlCommand command = con.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = "select Id, Nombre from T_Paises"; SqlDataReader dr = command.ExecuteReader(); while (dr.Read()) { lista.Add(new Comun.Pais(int.Parse(dr[0].ToString()),dr[1].ToString())); } dr.Dispose(); con.Dispose(); return lista; }

Ahora en la capa de LOGICA public List<Comun.Pais> LMostrarDatos() { AccesoDatos.ABM datos = new AccesoDatos.ABM(); return datos.MostrarPaises(); }

Finalmente la capa de PRESENTACION protected void Button4_Click(object sender, EventArgs e) { Logica.LABM obj = new Logica.LABM(); List<Comun.Pais> lista = new List<Comun.Pais>(); lista=obj.LMostrarDatos(); GridView1.DataSource = lista; GridView1.DataBind(); }

BUSQUEDA DE REGISTROS CON ExecuteReader


Comenzamos con la capa de ACCESO A DATOS public List<Comun.Pais> BuscarPais(int id) { List<Comun.Pais> lista = new List<Comun.Pais>(); string cadena = "Data Source=.;Initial Catalog=SVTP;Integrated Security=true"; SqlConnection con = new SqlConnection(cadena); con.Open(); SqlCommand command = con.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = "select Id,Nombre from T_Paises where Id=@ID"; command.Parameters.AddWithValue("@ID",id); SqlDataReader dr= command.ExecuteReader(); while (dr.Read()) { lista.Add(new Comun.Pais(int.Parse(dr[0].ToString()),dr[1].ToString())); }

16

dr.Dispose(); con.Dispose(); return lista; }

Ahora en la capa de LOGICA public List<Comun.Pais> LBuscarPais(int id) { AccesoDatos.ABM obj = new AccesoDatos.ABM(); return obj.BuscarPais(id); } Finalmente la capa de PRESENTACION protected void Button5_Click(object sender, EventArgs e) { Logica.LABM obj = new Logica.LABM(); List<Comun.Pais> lista = new List<Comun.Pais>(); lista = obj.LBuscarPais(int.Parse(txtID.Text)); GridView1.DataSource = lista; GridView1.DataBind(); }

BUSQUEDA DE REGISTROS CON ExecuteScalar


Comenzamos con la capa de ACCESO A DATOS public string BuscarPaisScalar(int id) { string cadena = "Data Source=.;Initial Catalog=SVTP;Integrated Security=true"; SqlConnection con = new SqlConnection(cadena); con.Open(); SqlCommand command = con.CreateCommand(); command.CommandType = CommandType.Text; command.CommandText = "select Nombre from T_Paises where Id=@ID"; command.Parameters.AddWithValue("@ID", id); string dato = command.ExecuteScalar().ToString(); con.Dispose(); return dato; } Ahora en la capa de LOGICA public string LBuscarPais(int id) { AccesoDatos.ABM obj = new AccesoDatos.ABM(); return obj.BuscarPaisScalar(id); } Finalmente la capa de PRESENTACION protected void Button5_Click(object sender, EventArgs e) { Logica.LABM obj = new Logica.LABM(); List<Comun.Pais> lista = new List<Comun.Pais>(); lista = obj.LBuscarPais(int.Parse(txtID.Text)); GridView1.DataSource = lista; GridView1.DataBind(); }

17
PROYECTO ASP.NET CON AJAX Vamos a utilizar la DB de NorthWind entonces debemos realizar un AttachmenT Primero comenzamos con agregar una solucin vacia. Ahora agregamos un nuevo proyecto de tipo ClassLibrary COMUN esta ser la capa comn A esta capa comn agregamos dos clases llamadas Categoria y Producto CLASE CATEGORIA namespace Comun { public class Categoria { public int CategoryID { get; set; } public string CategoryName { get; set; } } }

CLASE PRODUCTO namespace Comun { public class Producto { public int ProductID { get; set; } public int? CategoryID { get; set; } public string ProductName { get; set; } public decimal? UnitPrice { get; set; } public short? UnitsInStock { get; set; } } }

Ahora agregamos un nuevo proyecto de tipo ClassLibrary AccesoDatos esta ser la capa de acceso a datos AHORA AGREGAMOS A ESTA CAPA UN NUEVO ELEMENTO PARA EL TRABAJO CON LINQ TO SQL LINQ TO SQL CLASSES Y le damos por nombre NW, esto generara un DataContext que nosotros lo utilizaremos para poder conectarnos a nuestra base de datos Luego JALAMOS AMBAS TABLAS CATEGORIAS y PRODUCTOS A esta capa comn agregamos dos clases llamadas Categorias y Productos CLASE CATEGORIAS

namespace AccesoDatos { public class Categorias { public List<Comun.Categoria> ObtenerCatalogo() { var dc = new nwDataContext(); var resultado = from categoria in dc.Categories select new Comun.Categoria { CategoryID = categoria.CategoryID, CategoryName = categoria.CategoryName };

18

return resultado.ToList<Comun.Categoria>(); } } CLASE PRODUCTOS namespace AccesoDatos { public class Productos { public List<Comun.Producto> BuscarPorCategoria(int Categoria) { var dc = new nwDataContext(); var resultado = from pro in dc.Products where pro.CategoryID == Categoria orderby pro.ProductID select new Comun.Producto { CategoryID = pro.CategoryID, ProductID = pro.ProductID, ProductName = pro.ProductName, UnitPrice = pro.UnitPrice, UnitsInStock = pro.UnitsInStock }; return resultado.ToList<Comun.Producto>(); } }

public List<Comun.Producto> BuscarPorCategoria(int Categoria, decimal Precio) { var dc = new nwDataContext(); var resultado = from pro in dc.Products where pro.CategoryID == Categoria && pro.UnitPrice >= Precio orderby pro.ProductID select new Comun.Producto { CategoryID=pro.CategoryID, ProductID = pro.ProductID, ProductName = pro.ProductName, UnitPrice = pro.UnitPrice, UnitsInStock = pro.UnitsInStock }; return resultado.ToList<Comun.Producto>(); } public List<int> BuscarPorCategoriaYPreciosUnicos(int Categoria) { var dc = new nwDataContext(); var resultado = from p in dc.Products where p.CategoryID == Categoria group p by Convert.ToInt32 (p.UnitPrice.Value) into Grupo select Convert.ToInt32 (Grupo.Key); return resultado.ToList<int>(); } } }

19

AHORA AGREGAMOS UN PROYECTO DE TIPO CLASSLIBRARY LOGICA y Adicionamos dos clases CATEGORIAS y PRODUCTOS

CLASE CATEGORIAS namespace Logica { public class Categorias { public List<Comun.Categoria> ObtenerCatalogo() { return new AccesoDatos.Categorias().ObtenerCatalogo(); } } }

CLASE PRODUCTOS namespace Logica { public class Productos { public List<Comun.Producto> BuscarPorCategoria(int IDCategoria) { return new AccesoDatos.Productos().BuscarPorCategoria(IDCategoria); } public List<Comun.Producto> BuscarProCategoriaYPrecio(int IDCategoria, decimal Precio) { return new AccesoDatos.Productos().BuscarPorCategoria(IDCategoria, Precio); } public List<int> BuscarPrecios(int IDCategoria) { return new AccesoDatos.Productos().BuscarPorCategoriaYPreciosUnicos(IDCategoria); } } }

FINALMENTE AGREGAMOS UN WEBSITE Y COLOCAMOS UN DropDownList y un GridView Colocamos el siguiente cdigo tante en el Page Load como en el SelectedIndex del combo protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Logica.Categorias cat = new Logica.Categorias(); List<Comun.Categoria> listaCategorias = new List<Comun.Categoria>(); listaCategorias=cat.ObtenerCatalogo(); ddlCategorias.DataSource = listaCategorias; ddlCategorias.DataTextField = "CategoryName"; ddlCategorias.DataValueField = "CategoryID"; ddlCategorias.DataBind(); }

lblHoraFullPostBack.Text = DateTime.Now.ToLongTimeString();
}

20
protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e) { System.Threading.Thread.Sleep(5000); Logica.Productos pro = new Logica.Productos(); gvProductos.DataSource = pro.BuscarPorCategoria(int.Parse(ddlCategorias.SelectedValue)); gvProductos.DataBind(); } PARA SABER LA HORA QUE SE GENERO EL POSTBACK PODEMOS ADICIONAR UN LABEL Y EL CODIGO EN PAGE LOAD lblHoraFullPostBack.Text = DateTime.Now.ToLongTimeString();

AHORA SI COMENZAMOS CON AJAX PARA SOLO ENVIAR PEDAZOS DE PAGINA AL SERVER PARA QUE LO ACTUALICE
Lo primero que debemos hacer es jalar y colocar un

ScriptManager dentro de FORM

en el cdigo

HTML

de la pagina

Antes en VS 2005 esto no exista pero ya viene en Vs 2008 (AJAX EXtension) AJAX permite que en lugar que se hagan

FullPostBack

se hagan

PostBackParciales

Debajo del ScriptManager adicionamos un se actualice junto El cdigo sera igual a este:

UpdatePanel

este permite agrupar lo que quiero que

<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> //Este label esta fuera del UpdatePanel <asp:Label ID="lblHoraFullPostBack" runat="server" Text="Label"></asp:Label>

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> // <asp:Label ID="lblDD" runat="server" Text="Label"></asp:Label> <br /> <asp:DropDownList ID="ddlCategorias" runat="server" AutoPostBack="True" Height="20px" Width="305px" onselectedindexchanged="ddlCategorias_SelectedIndexChanged"> </asp:DropDownList> </ContentTemplate> </asp:UpdatePanel>

<asp:GridView ID="gvProductos" runat="server" Height="159px" Width="520px"> </asp:GridView>

21

EL CODIGO ACTUALIZADO SERIA protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Logica.Categorias cat = new Logica.Categorias(); List<Comun.Categoria> listaCategorias = new List<Comun.Categoria>(); listaCategorias=cat.ObtenerCatalogo(); ddlCategorias.DataSource = listaCategorias; ddlCategorias.DataTextField = "CategoryName"; ddlCategorias.DataValueField = "CategoryID"; ddlCategorias.DataBind(); } lblHoraFullPostBack.Text = DateTime.Now.ToLongTimeString(); lblDD.Text = DateTime.Now.ToLongTimeString(); }

SI EJECUTAMOS NO SE VE EL CARGADO DEL GRID VIEW PARA QUE SE VEA HACEMOS LO SIGUIENTE METEMOS EL GRID DENTRO DEL UPDATE PANEL <asp:GridView ID="gvProductos" runat="server" Height="159px" Width="520px"> </asp:GridView> </ContentTemplate> </asp:UpdatePanel>

Ahora podriamos colocar un progress template para ver lo que esta realizando la busqueda <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Label ID="lblDD" runat="server" Text="Label"></asp:Label> <br /> <asp:DropDownList ID="ddlCategorias" runat="server" AutoPostBack="True" Height="20px" Width="305px" onselectedindexchanged="ddlCategorias_SelectedIndexChanged"> </asp:DropDownList> <asp:UpdateProgress ID="UpdateProgress1" runat="server"> <ProgressTemplate> Buscando datos... </ProgressTemplate> </asp:UpdateProgress> <br /> <asp:DropDownList ID="ddPrecios" runat="server" AutoPostBack="true" onselectedindexchanged="ddPrecios_SelectedIndexChanged"> </asp:DropDownList> <br /> <asp:GridView ID="gvProductos" runat="server" Height="159px" Width="520px"> </asp:GridView> </ContentTemplate>

22
</asp:UpdatePanel>

AHORA NECESITO MOSTRAR LOS PRESION ENTONCES ADICIONAMOS UN UEVO DropDownList Esto lo realizamos por encima del GridView <br /> <asp:DropDownList ID="ddPrecios" runat="server" AutoPostBack="true" onselectedindexchanged="ddPrecios_SelectedIndexChanged"> </asp:DropDownList> <br /> Ahora en el codigo fuente colocamos: protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e) { Logica.Productos pro = new Logica.Productos(); ddPrecios.DataSource = pro.BuscarPrecios(int.Parse(ddlCategorias.SelectedValue)); ddPrecios.DataBind(); } Con esto todava se sigue mostrando el Grid esto no debera pasar, pero lo que sucede es que todos los UpdatePanel se actualizan al mismo tiempo Para solucionar este problema y que solo se muestre bajo condicin adicionamos como atributo de cada UpdatePanel el valor UpdateMode=Condicional

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">


Ahora en el codgio de los DropDownList colocamos protected void ddlCategorias_SelectedIndexChanged(object sender, EventArgs e) { // System.Threading.Thread.Sleep(4000); Logica.Productos pro = new Logica.Productos(); ddPrecios.DataSource = pro.BuscarPrecios(int.Parse(ddlCategorias.SelectedValue)); ddPrecios.DataBind(); } protected void ddPrecios_SelectedIndexChanged(object sender, EventArgs e) { Logica.Productos pro = new Logica.Productos(); gvProductos.DataSource = pro.BuscarProCategoriaYPrecio(int.Parse(ddlCategorias.SelectedValue),decimal.Parse(ddPre cios.Text)); gvProductos.DataBind(); } SI EJECUTAMOS TODAVIA NO APARECE EL GRIDVIEW CUANDO SELECCIONO UN PRECIO Para solucionar esto en el cdigo HTML colocamos esto: ESTO ES PARA INDICAR BAJO QUE EVENTO SE DISPARARA En el UpdatePanel dende esta el GridView colocamos lo siguiente <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional"> <ContentTemplate> <asp:Label ID="lblGrid" runat="server" Text="Label"></asp:Label> <br /> <asp:GridView ID="gvProductos" runat="server" Height="159px" Width="520px"> </asp:GridView> </ContentTemplate> <Triggers>

23
<asp:AsyncPostBackTrigger ControlID="ddPrecios" EventName="SelectedIndexChanged" /> </Triggers> </asp:UpdatePanel> </form>

SERVICIOS WEB CON ASP.NET

Creamos una aplicacin en ASP.NET de tipo Web Site pero en este caso seleccionamos Web Service y le damos un nombre como ser SWSVTP se crea el proyecto y un archivo con el nombre Service.asmx esta extensin es la que se utiliza en los servicios WEB Este archivo es una clase en la cual tenemos un [WebMethod] y un mtodo de tipo public Si queremos crear nuestro propio mtodo siempre debe de ser de tipo Public y con un [WebMethod] por encima del mtodo nuevo Ingresamos a este archivo y adicionamos nuestro mtodo [WebMethod] public int Sumar(int A, int B) { return A + B; } Ahora podemos probar nuestro Web Service y vemos que funciona Bien ahora a nuestra solucin agregamos un nuevo proyecto de tipo WebSite le damos el nombre Testeo. A esta aplicacin tenemos que agregar una Referencia a nuestro servicio Web Clik derecho en Testeo -> Add reference Web Service-> Discover -> le damos el nombre sw

Agregamos a nuestra app testeo Dos cajas de texto un label y un botn para consumir el mtodo SUMAR En el cdigo del botn colocamos: protected void Button1_Click(object sender, EventArgs e) { sw.ServiceSoapClient res = new sw.ServiceSoapClient(); int c = res.Sumar(int.Parse(txtA.Text), int.Parse(txtB.Text)); lblRes.Text = c.ToString(); }

BASE DE DATOS CON SERVICIOS WEB


Primero adicionamos en la aplicacion del Web Service una nueva clase con el nombre Empleado.cs Y adicionamos lo siguiente: public class Empleado { public Empleado() { // // TODO: Add constructor logic here // } public public public public } int Cod_Emp { get; set; } string Nom_Emp { get; set; } string Ape_Emp { get; set; } byte[] Img_emp { get; set; }

24

Ahora adicionamos un Linq To SQL en la aplicacin del Web Service y le damos como nombre Empleados.dbml Una vez que se crea jalamos del lado IZQ la tabla Empleados (de Northwind) esto para que se genere el DataContext En el cdigo del servicio colocamos [WebMethod] public Empleado ObtenerEmpleado(int cod) { var dc = new EmpleadosDataContext(); Empleado emp = null; var resultado = from e in dc.Employees where e.EmployeeID == cod select new Empleado { Cod_Emp = e.EmployeeID, Nom_Emp = e.FirstName, Ape_Emp = e.LastName, Img_emp = e.Photo.ToArray() }; emp = resultado.FirstOrDefault<Empleado>(); return emp;

Hacemos correr y probamos si nos devuelve el empleado segn el cdigo, en formato XML Ahora podemos publicar el servicio web como una aplicacin web tradicional Y verificamos el Servicio web publicado pero de forma remota, y nos damos cuenta que no se puede probar el Servicio web publicado como lo hacemos en local Seria bueno consumir el servicio desde un proyecto SilverLight

SEGURIDAD EN ASP.NET Enviar datos entre paginas Primero nos creamos un proyecto de tipo Web Site y adicionamos un Web Form Login.aspx En este login.aspx

Adicionamos el siguiente cdigo protected void btnEntrar_Click(object sender, EventArgs e) { if ((txtCorreo.Text != "") && (txtPassword.Text != "")) { //Application => Nos permite almacenar valores de la pagina en el servidor //Tenemos un solo application por Proyecto //Si quiero que todos los usuarios vean los valores lo hacemos con applicaction //Otro es el Session => Pero este existe por cada usuario Session["Correo"] = txtCorreo.Text; } Response.Redirect("Default.aspx");

25
En la pgina de Default.aspx adicionamos un Label para capturar o traspasar el correo protected void Page_Load(object sender, EventArgs e) { if (Session["Correo"] != null) { lblCorreoUsuario.Text = Session["Correo"].ToString(); } } Ponemos como pgina de inicio la de Login.aspx y probamos la aplicacin Y verificamos si el correo se enva a la otra pgina Los objetos Session tienen una duracin de 20 minutos por defecto, si el usuario no realiza nada en 20 minutos la sesin muere, podemos controlar los tiempos en el Web.Config o directamente en el servidor IIS VARIABLES DE APLICACIN Estos las comparten todos los usuarios. Existen varios objetos Sesiones y un solo objeto Application Ahora vamos adicionar un elemento GLOBAL APPLICATION CLASS este tiene eventos tanto para objetos sesin como para objetos application Su nombre debe ser si o si Global.asax Application_Start => Este se da la primera vez que el usuario solicita un recurso de nuestra aplicacin Application_End => cuando finaliza la aplicacin o cuando volvemos a publicar la aplicacin Ahora si quisiramos llevar un contador de sesiones podemos hacer lo siguiente void Application_Start(object sender, EventArgs e) { // Cdigo que se ejecuta al iniciarse la aplicacin Application["Usuario"] = 0; }

void Session_Start(object sender, EventArgs e) { // Cdigo que se ejecuta cuando se inicia una nueva sesin int contador = (int)Application["Usuario"]; contador++; Application["Usuario"] = contador;

Nos vamos a la pgina Default.aspx y en el Load adicionamos protected void Page_Load(object sender, EventArgs e) { if (Session["Correo"] != null) { lblSesiones.Text = "SESIONES = " + Application["Usuarios"].ToString(); lblCorreoUsuario.Text = Session["Correo"].ToString(); } }

26

Por defecto los objetos Session y Application se guardan en Memoria eso se conoce como InProcess. Nosotros podramos guardar estos datos en una DB para no tener problemas de apagones de luz Ahora podemos configurar una variable Application para que todos los usuarios puedan enviar mensajes. Entonces adicinamod una caja de texto, un control literal y un botn en la pagina Default.aspx protected void Button1_Click(object sender, EventArgs e) { Application.Lock(); //Esto es para bloquear la concurrencia en la modificacion del Mensaje Application["Mensajes"] = Application["Mensajes"].ToString() + Session["Correo"].ToString() + ">" + txtMensaje.Text; litMensaje.Text = Application["Mensaje"].ToString(); Application.UnLock(); } Para que en esta parte no me marque un error al iniciar porque el primer mensaje esta en null Application["Mensajes"] = Application["Mensajes"].ToString() + Session["Correo"].ToString() + ">" + txtMensaje.Text; nos vamos al global.asax y adicionamos void Application_Start(object sender, EventArgs e) { // Cdigo que se ejecuta al iniciarse la aplicacin Application["Usuario"] = 0; Application["Mensaje"] = ""; } Y podramos publicarlo para que todos vayan probndolo Bueno y esto se presta para formar un pequeo CHAT EJERCICIO 2 Ahora no hay nada que me evite meterme directamente a la pagina Default.aspx Sin antes pasar por la pagina de Login.aspx Este es un problema de seguridad, para resolver esto tenemos que aplicar autenticacin Primero debemos autenticar => identificar al usuario Segundo debemos dar autorizacin => Permisos a recursos Nos vamos a Web.Config y configuramos lo siguiente <Autentication mode=Forms> </Autentication> <authorization> // ? Esto es para usuarios anonimos // * Esto es para todos annimos y no anonimos <deny users=?> </authorization> De forma predeterminada siempre busca el archivo Login.aspx Ahora si cambiamos la pgina de inicio a Default.aspx y lo probamos igual nos manda a Login.apsx Ahora si nos autenticamos igual nos sigue mandando a login.aspx y no al Default.aspx Entonces le debemos de decir al ASP.NET que el usuario esta autenticado Entonces nos vamos a la pagina Login.aspx Realizaremos un ejemplo sencillo dejaremos ingresar a usuarios cuando su password sea 12345

27
protected void btnEntrar_Click(object sender, EventArgs e) { if ((txtCorreo.Text != "") && (txtPassword.Text != "")) { Session["Correo"] = txtCorreo.Text; if (txtPassword.Text == "12345") { //CON ESTO YA NOS AUTENTICA Y NOS REDIRECCIONA A DEFAULT.ASPX System.Web.Security.FormsAuthentication.RedirectFromLoginPage(txtCorreo.Text, false); } Response.Redirect("Default.aspx");

FIN DEL CURSO DE ASP.NET

También podría gustarte