lunes, 13 de febrero de 2017

El servidor web, por qué y para qué?



El servidor web
  • El principal servicio que nos interesa que brinda un servidor, es el de enviarle al usuario la página web que el mismo requiere. Y esto lo hace de distintas maneras. Si la página es simplemente un archivo estático, que no cambia nunca, directamente lo envía para su visualización.
  • En cambio, si lo que nuestra aplicación necesita es mostrar distinta información de acuerdo a lo que interactúa el usuario mientras navega, ahí empezamos con lo que llamamos programación de páginas dinámicas.
Páginas dinámicas
  • Un sitio web dinámico es uno que puede tener cambios frecuentes en la información. Cuando el servidor web recibe una petición para una determinada página de un sitio web, la página se genera automáticamente por el software, como respuesta directa a la petición de la página.
  • Hablando de manera mas general el término "página web dinámica" lo usamos para referirnos a alguna página específica que es generada de manera diferente para cada usuario, en cada recarga de la página o por las acciones específicas que los usuarios realizan al navegarla.
Navegación condicionada
  • Las páginas dinámicas son el resultado de la ejecución de un programa en algún tipo de lenguaje de programación en el servidor de la página web, el cual genera la página antes de enviarla al cliente, o bien de la ejecución en nuestra PC de un código que crea la página completa antes de que un navegador la visualice.
  • De esto nace el concepto de Navegación Condicionada, que se refiere a cierta información o pantallas que se pueden mostrar o no en función del valor de una condición, que depende de las acciones del usuario. En este capítulo vamos a ver unos primeros ejemplos de cómo hacer esto en .NET.
MVC
  • MVC en la informática, significa sencillamente Model–View–Controller, o en español Modelo-Vista-Controlador.Referirnos al patrón MVC, sencillamente significa que es una forma de ordenar nuestros sistemas que se repiten constantemente, y por ello se dice que es un patrón.
  • Este patrón lo que hace, es separar nuestro sistema en partes para que sea mas sencillo de programar y de entender. Cómo separa el patrón nuestro sistema? En tres partes principales: el Modelo (todo lo que tiene que ver con la inteligencia de mi sistema y los datos), las Vistas (la interfaz de usuario) y los Controladores (quizás lo mas difícil de entender, que es quien reconoce las acciones de los usuarios y ejecuta acciones).
  • Para ponerlo mas fácil, piensen en una página web que están navegando. Lo que están viendo, es la vista de la pantalla inicial o Index. En esa pantalla ustedes tienen un menú desplegable donde pueden seleccionar de que país son. Una vez que seleccionan su país, el controlador le enviará la información al modelo, quien a su vez, en base a lo que hayan programado, decidirá que provincias o estados se corresponden a ese país, y le dirá a la vista que muestre otro menú con la información que corresponde.
  • De esta manera, tengo 3 partes de mi aplicación separadas, cada una ocupándose de una parte distinta, y haciendo mas sencilla mi programación. Esto nos va a permitir también hacer mas fácil el testing de mi sistema y el mantenimiento, porque cada parte es mas chica que el total.
Flujo general MVC
  • En general, el flujo en una aplicación que tiene la forma MVC es la siguiente:
    • El usuario interactúa con la Interfaz alguna manera (por ejemplo, presionando algún botón del ratón, o presionando una tecla para ingresar un número o caracter).
    • El Controlador recibe la información ingresada a través de la interfaz, y la convierte en la acción que corresponde, para que sea entendida por el modelo.
    • El controlador notifica al modelo de la interacción del usuario, y esto muchas veces hace que cambie el estado del modelo, porque nuevos datos son ingresados y el modelo debe aprenderlo y modificar otra información en base a ellos (por ejemplo si el usuario agregó un producto a un carrito de compras).
    • La vista le pregunta al modelo si hubo cambios para generar una nueva interfaz de usuario apropiada (por ejemplo, mostrando la nueva lista del carrito de compras).
    • La interfaz de usuario se queda esperando por nuevas interacciones, empezando de nuevo todo el ciclo.
Primera aplicación web MVC
  • Para crear nuestra primera aplicación web, usaremos la herramienta llamada Visual Web Developer que en realidad ya viene dentro del programa Visual Studio. Esta herramienta nos permite ya tener muchas cosas solucionadas en nuestro sistema y nos da también algunas funcionalidades para armar nuestro programa de manera mas visual y sencilla.
  • Cuando abran el Visual Studio, si ya tienen el Visual Web Developer incluido, seleccionen Nuevo Proyecto.

  • Se abrirá la ventana que les mostramos antes. Allí tienen que:
    • Abrir las plantillas de Visual C#
    • Seleccionen la plantilla Aplicacion Web ASP.NET MVC 3
    • Pongan como Nombre del Proyecto MvcDemo
    • Pongan la dirección de los archivos en el lugar que prefieran. Por ejemplo c:\Demo
    • Clickeenen OK
  • Cuando se abra la siguiente ventana de Nuevo Proyecto:
    • Seleccionen la plantilla de Aplicación para Internet
    • Seleccionen el Motor Razor
    • Seleccion en HTML5 Markup
    • Click en OK
  • Visual Studio abrirá una ventana como la siguiente:
  • Como ven en la ventana de la derecha, al crear un proyecto MVC, Visual Studio automáticamente nos creo las carpetas Modelso Modelos (dependiendo del idioma), Controllerso Controladores, Viewso Vistas.
  • En la carpeta App_Datavan a encontrar distinta información relacionada a la aplicación, como ser conexiones a bases de datos, que veremos luego en otro capítulo.
  • En la carpeta Content es donde guardarán todo lo referido a diseño, imágenes y otros recursos que puedan necesitar para su sistema.
  • En la carpeta scripts guardaremos toda la programación en lenguaje Javascriptque sea necesaria para nuestro sistema (acuerdensé, que siempre se usa mas de un lenguaje para programar, aunque haya uno principal)
  • Para empezar a crear nuestra primera aplicación web, lo que vamos a hacer incialmente es darle un poco de diseño a nuestro sistema. Para ello en la carpeta Shared, dentro de Viewso Vistas vamos a editar el archivo _Layout.cshtml, que representa la diagramación de nuestras interfaces. Cambiemos el contenido del archivo por el siguiente:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")"></script>
</head>
<body>
<ulid="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Peliculas", "Index", " Peliculas")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
</ul>
<sectionid="main">@RenderBody()</section>
</body>
</html>
  • El código que empieza con el símbolo @ permite modificar lo visualizado en la pantalla:
    • @Url.Content(): Aquí se mostrarán links a recursos o archivos que vamos a estar usando
    • @Html.ActionLink(): Aquí se mostrarán links a otras pantallas
    • @ViewBag.Title: Aquí se mostrarán los títulos de las pantallas
    • @RenderBody(): Esta instrucción mostrará el contenido de la pantalla que necesitemos
  • Luego le daremos un diseño a nuestra aplicación modificando el archivo Site.css que se encuentra en la carpeta Content. Reemplacemos su contenido con lo siguiente:
body{
font: "TrebuchetMS",
Verdana, sans-serif;
background-color: #5c87b2;
color: #696969;
}
h1{
border-bottom: 3px solid#cc9900;
font: Georgia, serif;
color: #996600;
}
#main{
padding: 20px;
background-color: #ffffff;
border-radius: 0 4px 4px 4px;
}
a{
color: #034af3;
}
/* MenuStyles------------------------------*/
ul#menu{
padding: 0px;
position: relative;
margin: 0;
}
ul#menuli{
display: inline;
}
ul#menuli a{
background-color: #e8eef4;
padding: 10px 20px;
text-decoration: none;
line-height: 2.8em;
/*CSS3 properties*/
border-radius: 4px 4px 0 0;
}
ul#menuli a:hover{
background-color: #ffffff;
}
/* FormsStyles------------------------------*/
fieldset{
padding-left: 12px;
}
fieldsetlabel{
display: block;
padding: 4px;
}
input[type="text"], input[type="password"]{
width: 300px;
}
input[type="submit"]{
padding: 4px;
}
/* Data Styles------------------------------*/
table.data{
background-color:#ffffff;
border:1px solid#c3c3c3;
border-collapse:collapse;
width:100%;
}
table.datath{
background-color:#e8eef4;
border:1px solid#c3c3c3;
padding:3px;
}
table.datatd{
border:1px solid#c3c3c3;
padding:3px;
}
  • Luego, en nuestra carpeta Controllers veremos que tenemos dos archivos: HomeController.cs (para las páginas Home y About) y AccountControllers.cs (para las pantallas de Login).
  • En una aplicación web común, uno directamente le pide al servidor un archivo, como por ejemplo index.html, o index.asp. En una aplicación MVC, lo que se hace cuando pido por la pantalla Index, o Home, o About, es llamar a un programa que se encuentra en mis Controladores que mostrarán una pantalla de acuerdo a la dirección web que le estoy pasando.
  • Entonces abrimos el HomeController.csy reemplazamos el código con lo siguiente:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespaceMvcDemo.Controllers{
publicclassHomeController: Controller
{
publicActionResultIndex()
{
returnView();
}
publicActionResultAbout(){
returnView();}
}
}
  • En la carpeta Views, dijimos que tendríamos las interfaces a mostrar, y las mismas podrán tener distintas extensiones: HTML, ASP, ASPX, CSHTML, etc.
  • En Viewstendremos una subcarpeta por cada uno de los controladores que definamos. De esa manera un controlador puede mostrar cualquiera de las pantallas definidas en su subcarpeta correspondiente. Por ejemplo, al tener el controlador HomeController, tendremos la carpeta Home donde guardaremos la página inicial de nuestra aplicación, llamada index.cshtmly la página about.cshtml.
  • En el archivo index.cshtmlpondremos el siguiente código:
@{ViewBag.Title= "Home Page";}<h1>HelloWorld!</h1><p>ThisismyfirstMVC website</p>
Y en el about.cshtmlpondremos:
@{ViewBag.Title= "AboutUs";}<h1>AboutUs</h1><p>Weare thegreatestever!</p>
  • Luego, en Visual Studio, presionamos F5 para ver en el navegador nuestra primera aplicación funcionando. Podemos clickearen Home o Aboutpara ver nuestras dos pantallas.
Seguir avanzando
  • Qué pasa si queremos hacer algo mas avanzado? Que interactúe de otras maneras con mis usuarios? Cómo hago si quiero enviar un mail cuando un usuario se registra en mi sitio, o si alguien me hace una consulta y yo quiero recibirla en mi casilla de correo? O cómo hago para crear un chat y divertirme con mis amigos?
  • Todo esto es posible de manera muy sencilla y lo veremos mas adelante, pero primero debemos entender como es que funcionan este tipo de mensajerías.
Mensajería
  • Tanto para enviar un correo electrónico como un mensaje de un chat mi sistema debe conectarse de alguna manera con un programa, o servidor, que se encarga de recibir el contenido que quiero enviar, junto con mucha información que alguna nosotros podemos ver y otra es invisible a nosotros como usuarios. En el mensaje no solo envío texto, o el título, sino que también, a quién estoy dirigiendo el mensaje, el formato del mismo (si es HTML, texto plano, emoticones, imágenes, etc) y otros aspectos de los que podemos saber o no.
  • Una vez que mediante nuestra programación nos conectamos con el sistema correspondiente y les brindamos la información necesaria, se resolverá si la dirección de destino es correcta y se enviará el mensaje. Al enviar el mensaje pueden ocurrir distintos inconvenientes por el cual la información no llega a destino, ya sea en un mail o en un chat. El único problema no es que la dirección no exista. Podría ocurrir que quien va a recibir el correo o mensaje de chat nos tenga bloqueados, o que no tenga espacio para recibir la información. Y en esos casos el servidor de envío de mensajes nos devolverá algún tipo de código de error que nuestro sistema deberá entender y traducirlo a un lenguaje para que los usuarios lo entiendan.
  • La diferencia principal entre un correo electrónico y un chat es que cuando abrimos el chat y seleccionamos con que usuario queremos conversar, ya automáticamente el programa tiene guardada la dirección de adonde se debe entregar el mensaje, y no hay posibilidad de error con ello. Lo único que puede ocurrir es que el receptor nos tenga bloqueados, o no se encuentre conectado y no pueda recibir el mensaje. Pero aparte de ello, ambos tipos de funcionalidades.
  • Pero enviar un email en .NET puede ser tan sencillo como escribir:
try
{
// Send email
WebMail.Send(to:"someone@example.com", subject: "Email example" +
customerEmail,body: customerRequest);
}catch (Exceptionex )
{<text>@ex</text>
}
  • Pero esto lo veremos mas adelante a medida que armemos nuestra aplicación.
Espero haber ayudado en algo. Hasta la próxima oportunidad!

DESCARGAR PUBLICACIÓN








  

No hay comentarios:

Publicar un comentario

       

Etiquetas

Academy (23) Accediendo a datos con ADO .NET (31) Acceso a la red (30) Algoritmo (34) Algoritmos en JAVA (2) Ampliación de clases (2) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (3) APRENDA A PROGRAMAR COMO SI ESTUVIERA EN PRIMERO - Autores : IKER AGUINAGA (10) Aprendiendo a desarrollar en Windows 8 (5) Aprendiendo UML en 24 Horas (Autor : Joseph Schmuller ) (30) Arquitectura (29) Arquitectura del Computador (3) Arquitectura del Computador - Historia de la informática (1) Asignación de direcciones IP (23) Aspectos fundamentales de bases de datos (5) Auditoría de la dirección (2) Auditoría de Sistemas (3) Auditoría Informática - Un enfoque práctico - Mario G . Piattini y Emilio del Peso (7) Avanzado (23) Base de Datos (67) Básico (23) Bios (29) Business Productivity Online Suite - BPOS (3) Capa de Red (22) Capa de Transporte (16) Capítulo 1 - Documentos HTML5 (6) Capítulo 10. API Web Storage (2) Capítulo 11. API IndexedDB (4) Capítulo 12. API File (1) Capítulo 2. Estilos CSS y modelos de caja (7) Capítulo 3. Propiedades CSS3 (4) Capítulo 4. Javascript (6) Capítulo 5. Video y audio (6) Capítulo 6. Formularios y API Forms (8) Capítulo 7. API Canvas (5) Capítulo 8. API Drag and Drop (2) Capítulo 9. API Geolocation (2) CCNA1 v5.0 (212) CCNA1 v6.0 (23) CCNA2 v5.0 (26) CCNA3 v5.0 (25) CCNA4 v5.0 (23) CD-ROM (3) Chapter 1 How does Xamarin.Forms fit in? (7) Chapter 2 Anatomy of an app (5) Cisco (314) Cloud Computing (3) CNNA v5.0 Routing & Switching (233) CNNA v6.0 Routing & Switching (2) Codigo (2) Computadora (32) Configuración (29) Configuración de un sistema operativo de red (21) Control (29) Creación de tipos de datos y tablas (3) Creación y Administración de bases de datos (3) Creando la Interface de la Aplicación Windows (50) Creating Mobile Apps with Xamarin.Forms (13) Cuenta (29) Curso (32) Curso Aprendiendo a Programar (25) Datos (3) Desarrollando en Windows 8 - AVANZADO (2) Desarrollando en Windows 8 - BÁSICO (3) Desarrollando en Windows 8 - INTERMEDIO (2) Desarrollo (2) Desarrollo .Net (21) Desarrollo avanzado de Windows Store Apps usando C# (1) Desarrollo basado en conceptos de Ingeniería de Software para Visual Studio (2) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (37) DESARROLLO DE APLICACIONES WINDOWS CON MICROSOFT .NET (Autor: Luis Dueñas Huaroto) (29) Desarrollo en Microsoft Visual Studio (44) Desarrollo en Microsoft Visual Studio - AVANZADO (15) Desarrollo en Microsoft Visual Studio - BÁSICO (14) Desarrollo en Microsoft Visual Studio - INTERMEDIO (18) Desarrollo en Windows Phone 8 (13) Diagnostico (4) Diagrama (3) Diagramas de actividades (2) Diagramas de colaboraciones (2) Diagramas de secuencias (2) Digital (2) Diplomado (2) Disco (29) Disco Duro (4) Diseño de aplicaciones de Windows 8 en HTML 5 (7) Dispositivos Electrónicos (11) Doctorado (2) Ejemplos (3) Ejemplos de algoritmos (27) El camino hacia el CSS3 (3) El diseño web flexible (6) El elemento de diseño Canvas (3) El enfoque de los sistemas (3) El flujo de un programa (2) El gran libro de HTML5 - CSS3 y Javascript - Autor: Juan Diego Gauchat (55) El principio de organicidad (7) Electrónica (2) Elementos de un sistema (5) Empresas (2) Entrada y salida (4) Entropía y neguentropía (7) Estrategia (2) Estructura de un programa Java (12) Estructuras de almacenamiento (10) Estructuras de control (6) Estructuras de las tablas en SQL Server (2) Estructuras fundamentales de los datos (2) Ethernet (21) Evolución y Familias de los Microprocesadores (15) Exámen (23) Exploración de la red (23) Extensión de clases (4) Facebook (4) Familia Intel (15) Forefront (8) Función (3) Funciones de una red (12) Funciones de una red informática (1) Fundamentos de C# para absolutos principiantes (17) Fundamentos de programación en Java (50) Generaciones de la computadora (5) Gestión (3) Gestión de riesgos - Auditoría de Sistemas (1) GONZALO MARTÍNEZ (1) Grupos Facebook (1) Harvard (29) Historia de las computadoras (11) HTML5 y CSS3 - Autor: Christophe Aubry (99) HTML5 y CSS3 aplicadal texto (7) HTML5 y CSS3 para los formularios (15) Imágenes (2) Implementación de Windows 7 (11) Información (31) Informática (29) Ingeniería (4) Instalar (29) Inteligencia (2) Inteligencia de Negocios con SQL Server (3) Intermedio (23) Internet (29) Internet Explorer 9 (3) Introducción a ASP.NET 5 (8) Introducción a Java (7) Introducción a jQuery (8) Introducción a la Auditoría de Sistemas (2) Introducción a la teoría general de sistemas (Oscar Johansen Bertoglio) (39) Introducción a Networking (2) Introducción a Window Forms (5) Introducción al acceso a datos con ADO .NET (9) Investigación de Operaciones (12) Java (52) Jump Start de consultas en las bases de datos de Microsoft SQL Server 2012 (8) La definición de un Sistema (6) La evolución del HTML y del CSS (3) La nueva sintaxis HTML5 (12) LA QUINTA DISCIPLINA en la práctica (Autor : Peter Senge) (28) Las animaciones en CSS3 (5) Las transformaciones CSS3 (11) Las transiciones con CSS3 (8) Licenciamiento Microsoft (3) Local Area Network (LAN) - Red de Area Local (2) Lógico (2) Los elementos de la estructura en html5 (9) Los elementos multimedia: audio y vídeo (2) Los estilos de caja en CSS3 (13) Los nuevos selectores de CSS3 (6) Maestría (2) Mantenimiento de Mouse y Teclado (2) Manual de Microsoft SQL Server - Full Transact SQL (68) Manual de soporte técnico para escuelas sobre windows 7 (42) Marco Teorico de Investigación de Operaciones (6) Medios de Almacenamiento (11) Medios de Networking (2) Mejorando la Interface de las Aplicaciones Windows (26) Memoria Tipos y Clases (5) Método (2) Metodología (1) Microsoft (324) Microsoft Lync 2010 (7) Microsoft Silverlight 4.0 (2) Microsoft Virtual Academy (356) Modelo (2) Modelo OSI y TCP-IP (2) Modelos con poco grado de dificultad de Programación Lineal - Investigación de Operaciones (13) Modelos con razonable grado de dificultad de Programación Lineal - Investigación de Operaciones (10) Modelos de desafio de Programación Lineal - Investigación de Operaciones (5) Modelos difíciles de Programación Lineal - Investigación de Operaciones (5) Modelos Fáciles de Programación Lineal - Investigación de Operaciones (13) Modelos lineales con solver (3) Modulo (23) Movimiento (2) Mozilla (29) MS SQL Server (77) MS Virtualization para Profesionales VMware - Gestión (3) MS Virtualization para Profesionales VMware- Plataforma (4) MVA (263) Negocio (2) Nivel Avanzado Desarrollo .Net (6) Nivel Básico Desarrollo .Net (11) Nivel Intermedio Desarrollo .Net (8) Normas técnicas peruanas y su evolución - Auditoría de Sistemas (1) Nube Privada - Avanzado (6) Nube Privada - Básico (6) Nube Privada - Intermedio (6) Office 365 (3) Optimización de Escritorio (10) Optimización de Escritorio - Avanzado (4) Optimización de Escritorio - Básico (3) Optimización de Escritorio - Intermedio (3) ORACLE 10g - ADMINISTRACIÓN Y ANÁLISIS (3) Oracle 10g y el Grid Computing (3) Organización aleatoria y secuencial (1) Partes principales de la Mainboard (12) Perceptron (2) Perfil (2) Periféricos de Entrada / Salida (15) Pesi (2) PHP y MySQL - Manual de aprendizaje para crear un sitio web - Autor : Olivier ROLLET (79) Plan (2) Plataforma (29) PMBOK (24) PMBOK - Guía de los fundamentos para la dirección de proyectos (24) PMBOK - INFLUENCIA DE LA ORGANIZACIÓN Y CICLO DE VIDA DEL PROYECTO (6) PMBOK - Introducción (11) PMBOK - PROCESOS DE LA DIRECCIÓN DE PROYECTOS (5) Prevención - Herramientas e Instrumentos de Medida (9) Principios básicos de enrutamiento y switching (186) Proceso (2) Proceso de auditoría de sistemas informáticos (2) Programación en Android - Auor : Salvador Gómez Oliver (46) Programación paso a paso de C# - Autor : Nacho Cabanes (16) Protocolos y comunicaciones de red (17) Proyecto (2) Qué es un sistema (4) Red de Área Local Inalámbrica (WLAN) (4) Redes (30) Redes inalámbricas - WIRELESS - Conocimiento general (15) Redes neuronales (2) Redes y Comunicaciones (45) Reparación de Fuentes - UPS - Estabilizadores (10) Reparación de Impresoras (9) Reparación de Monitores (16) Router (29) Seguridad en la Nube (3) Seminario (23) Server (24) Sharepoint 2010 - Nivel Básico (6) Sharepoint 2010 - Niveles Avanzados (18) Sharepoint 2010 - Niveles Avanzados - Básico (8) Sharepoint 2010 - Niveles Avanzados - Intermedio (9) Sinergia y recursividad (4) Sistema (33) Sistema de Cableado Estructurado (9) Software (30) SOLUCIÓN GRÁFICA DE MODELOS DE PROGRAMACIÓN LINEALES - INVOPE (8) Soporte a Infraestructura (3) SQL (38) SQL Azure - Introducción (3) Subsistemas de control (4) Tablas (4) Tarjeta Principal del Sistema (10) Tarjetas de Interfaces (7) Tecnología (31) Tecnologías LAN (1) TEORÍA GENERAL DE SISTEMAS (1) Tic (2) Tipo (2) TML5 y CSS3 - Autor: Christophe Aubry (12) Trabajando con el Formulario (7) Un diseño HTML5/CSS3: dConstruct 2011 (3) Un diseño HTML5/CSS3: FlipThru (2) Un diseño HTML5/CSS3: The Cat Template (2) Usando Controles Windows Forms (12) Usando Herramientas de Datos de Visual Studio (6) Ventas (2) Virtualización Hyper - V Nivel Básico (5) Virtualización Hyper - V Nivel Intermedio (5) What’s New in Windows 8.1 Security (4) Window (29) Windows 7 Segunda Fase - AVANZADO (4) Windows 7 Segunda Fase - BÁSICO (6) Windows 7 Segunda Fase - INTERMEDIO (4) Windows 8 - Vista Previa (4) Windows 8.1 To Go (2) Windows Azure (3) Windows Phone 7 (2) Windows Server 2008 R2 (3) Windows Server 2012 - Gestión y Automatización (3) Windows Server 2012 R2 Essentials (7) Windows Server 2012: Almacenamiento (5) Windows Server 2012: Identidad y Acceso (4) Windows Server 2012: Revisión Técnica (7) Xamarin (1)

Páginas vistas en total según Google