Compartir a través de


Este artículo proviene de un motor de traducción automática.

Sitios web Azure

Enseñanza desde la nube

James Chambers

Descargar el código de muestra

Este es un momento emocionante para ser un Desarrollador Web. La tarea de end-to-end de crear un proyecto y desplegarlo a un extremo orientada al público es verdaderamente un reto que alguna vez fue desalentadora, quizás incluso prohibitivo. Aun así hoy se destaca como uno de la de informática desafíos "resuelto".

Con muy pocos recursos, se pueden descargar un IDE gratuito y herramientas de control de fuente. Puede iniciar un proyecto y desplegar una infraestructura rico, mantenido por ti sin necesidad de acceso a o el conocimiento del hardware. Usted puede tener su proyecto sin costo alguno para empezar.

Tenemos que trabajar con los bloques de construcción son más completos que nunca — ya sea PHP, Java o Microsoft .NET Framework. Ahora centrémonos en la UX en lugar de gestión de proyectos, redes, almacenamiento de información, procedimientos de implementación o escalabilidad.

FrontClass, la aplicación cubierta en este artículo, es algo que hace décadas habría sido semanas de trabajo, si no más. Habría sido difícil empezar a trabajar en todos los ambientes. Despliegue hubiera sido una pesadilla. Y, lo más probable es no habría sido capaz de resolver la escalabilidad en ese lapso. Hoy, puedo construir el proyecto y tiene desplegados en horas y listo a escala. La solución descargable contiene el código fuente completo, trabajo que puede implementar sin tener que modificar tu propia cuenta de Microsoft Azure.

Comencé a FrontClass mientras que el voluntariado en una escuela local, enseñanza de programación para niños edades 10 a 14. Quería compartir contenido con estudiantes de una manera que podría controlar el ritmo, pero deja los escalones vuelve al anterior bajo demanda. Existen tres áreas funcionales de la aplicación que ayudan a un maestro a llevar a cabo una clase: composición de clase, aula instrucción y estudiante de participación. Cada una de estas áreas se descomponen, pero, naturalmente, hay algunas coincidencias.

Proyecto básico

Para compilar la aplicación, utilizare Visual Studio 2013 Update 2. También usaré la aplicación Web ASP.NET al crear la solución y la plantilla ASP.NET MVC. El proyecto generado desde la plantilla utilizará el marco popular de front-end Bootstrap para labrar y algunas funciones de interfaz de usuario.

Para habilitar la funcionalidad en tiempo real, te agregue los paquetes SignalR y usar herramientas ahora conocido por Visual Studio. También usaré las librerías jQuery requerida en las páginas del cliente. Podrá configurar el Entity Framework (EF) a utilizar LocalDb por defecto en el desarrollo­ment entorno, pero al desplegar a sitios Web de Azure, va a utilizar la base de datos de SQL Azure como el almacén de datos. Empiezo a todo el proyecto, sin embargo, en el Portal de Azure (portal.azure.com), donde puedo configurar mi objetivo de despliegue.

Crear el sitio Web de Azure en la esquina inferior izquierda del Portal, haga clic en nuevo y seleccione el sitio web + SQL plantilla, como se muestra en la figura 1. Azure creará un conjunto de recursos vinculados. Seleccione un nombre apropiado para este grupo y el nombre de la aplicación. Puedo elegir crear un nuevo servidor de base de datos o seleccione una existente en mi cuenta para crear la base de datos para mi sitio. Se recomienda tener el sitio Web y la base de datos en la misma zona para reducir los tiempos de tráfico de red.

Create a New Azure Web Site with Linked Database
Figura 1 crear un nuevo sitio Web azul con base de datos vinculado

En mi caso, he llamado el grupo de recursos e-learning, la base de datos FrontClass_DB y el sitio FrontClass. Usted necesitará elegir un nombre de sitio único. Una vez que termine de aprovisionamiento, tengo el frontclass.azurewebsites. neto hostname y mi objetivo de despliegue está listo para alojar mi sitio.

A pesar de la aparición de acontecimientos mágicos, realmente no hay mucho que debe sorprender aquí. He creado una entrada en el DNS, asigna un nombre de host a una dirección IP y hecho algunas opciones de configuración como documentos predeterminados y las cadenas de conexión. Estas son esencialmente las cosas que estarías haciendo detrás de las escenas para que tu sitio corriendo en IIS. Así que, una vez más, no es mágico, pero es muy conveniente. También hay algunas herramientas de tipo infraestructura como fuente control y despliegue de scripts disponibles para ayudar a empezar.

Crear la solución a continuación, diríjase a Visual Studio y seleccione la aplicación de Web ASP.NET ya mencionados como base para mi solución. Como elegir el tipo de proyecto para crear — utilizando la plantilla ASP.NET MVC — también tengo opciones para crear los recursos relacionados en Azure. Ya he creado el sitio y la base de datos a través del Portal, desactive la casilla de verificación y proceder a crear el sitio.

Componer módulos del curso

Por el alcance de este proyecto, soy capaz de mantener un modelo de datos bastante sencillo. Utilizo EF6 para crear los modelos a través de código de primera, que deja la puerta abierta para las modificaciones en el camino con las migraciones de datos. El resultado final, se muestra en la figura 2, es un simple conjunto de clases que representan las estructuras curso, módulo y paso.

The Basic Application Data Model
Figura 2 el modelo de datos de aplicación básica

Hay un poco de ceremonia a caminar por donde lo quiero a todo el cableado. Es decir, yo quiero utilizar una única base de datos, yo quiero ser capaz de controlar cuando se generan las migraciones y quiero mi aplicación a ejecutar automáticamente cualquier migraciones excepcionales en el inicio de la aplicación.

Esto me permite controlar explícitamente los cambios que aparecen en cada migración. También permite mi solicitud de actualización de sí mismo sin intervención. También establecerá un medio para rellenar previamente la base de datos con la función de administrador y el papel de Instructor (el primer y solamente el usuario administrativo) a través de la anulación de la semilla en la clase de configuración.

Especifique una cadena de conexión Entity Framework me permite usar la misma base de datos con diferentes contextos y las migraciones dentro de una cadena de conexión única. Llamando al constructor de la clase base y pasando un nombre, el marco se verá primero en la aplicación o la configuración Web para ver si hay una cadena de conexión definida por el mismo nombre. Si es así, lo utilizará para realizar la conexión.

Historia de migración para cada contexto es mantenida por iniciar el espacio de nombres como parte del proceso de actualización. Esto ayuda a mis migraciones ejecutar independientemente uno del otro. Para configurar esto, he añadido un constructor predeterminado para mi clase de contexto de la siguiente manera:

public FrontClassContext()
  : base("DefaultConnection") { }

Si nos fijamos en el contexto creado como parte de la plantilla de proyecto que se encuentra en el archivo IdentityModels.cs, verás que hay un constructor predeterminado similar presente. Aunque es ligeramente modificado para reflejar el carácter de la clase base IdentityDbContext, todavía utiliza la DefaultConnection cadena de conexión del archivo Web.Config.

Habilitar las migraciones generé la clase de configuración para las entidades creadas por ejecutar el siguiente comando desde la consola de Administrador de paquetes en Visual Studio:

Enable-Migrations -ContextTypeName FrontClass.DAL.FrontClassContext

Esto enciende las migraciones para mi curso -­entidades relacionadas. Quiero hacer lo mismo con el ApplicationDbContext, también. Podría correr ese comando otra vez con el nombre de clase cambiado. Sin embargo, cuando habilitar configuración, migraciones y siembra en el contexto donde se almacenan las cuentas, no quiero sobrescribir la clase de configuración anteriormente escalonada. Por el contrario, especificar un directorio alternativo para las migraciones, como sigue, con las migraciones­directorio parámetro pasado en el comando:

 

Enable-Migrations -ContextTypeName FrontClass.Models.ApplicationDbContext -MigrationsDirectory:"Models\AccountMigrations"

Añadir las primeras migraciones el siguiente paso es simplemente las clases se ejecutará el Entity Framework del andamio. Usar el siguiente comando dos veces, una vez para cada DbContext para que me gustaría crear una migración:

Add-Migration Initial-Model -ConfigurationTypeName FrontClass.Migrations.Configuration
Add-Migration Initial-Model -ConfigurationTypeName FrontClass.Models.AccountMigrations.Configuration

Una vez más, trabajar con múltiples contextos añade un poco de complejidad porque tienes que especificar el parámetro ConfigurationTypeName. De lo contrario, esto es una operación sencilla.

Establecer la estrategia de base de datos de inicialización para configurar EF para ejecutar mis migraciones automáticamente, necesito saber qué estrategia utilizar antes de realizar cualquier acceso de base de datos. Sin hacerlo, podrá recibir los mensajes de excepción en tiempo de ejecución que indican que mi modelo no está sincronizada con la base de datos. Cada cambio a mis clases afecta el hash calculado de mi modelo de datos, que se realiza un seguimiento en la base de datos.

En mi Global.asax he añadido las siguientes dos líneas de código para utilizar al inicializador de MigrateDatabaseToLatestVersion:

Database.SetInitializer<ApplicationDbContext>(
  new MigrateDatabaseToLatestVersion
    <ApplicationDbContext, 
     FrontClass.Models.AccountMigrations.Configuration>());
Database.SetInitializer<FrontClassContext>(
  new MigrateDatabaseToLatestVersion
    <FrontClassContext, FrontClass.Migrations.Configuration>());

Tenga en cuenta que estoy llamando al método SetInitializer genérico que acepta el contexto que quiero configurar. En mi caso, mis clases de configuración son nombre así que he especificado los nombres clase totalmente namespaced.

Las tablas de la semilla en la primera carrera, quiero ser capaz de ofrecer una experiencia que permite a alguien "simplemente inicie una sesión" y empezar a utilizar la aplicación. Podría crear un controlador de una sola ejecución similar a lo que encontrarías en aplicaciones populares blogs. Otra opción es utilizar los métodos de semilla en mis clases de configuración. El método de semilla se pasa en una instancia del contexto apropiado, de la cual puedo manipular las tablas.

Con identidad ASP.NET 2.0, también tengo un rico conjunto de clases de EF-conscientes. Esto me permite inyectar condicionalmente el papel y el usuario en la base de datos, como lo estoy haciendo figura 3.

Figura 3 siembra el primer papel y usuario administrativo

if (!context.Roles.Any(r => r.Name == 
  FrontClass.MvcApplication.AdministratorRoleName))
{
  var roleStore = new RoleStore<IdentityRole>(context);
  var roleManager = new RoleManager<IdentityRole>(roleStore);
  var identityRole = new IdentityRole 
    {Name = FrontClass.MvcApplication.AdministratorRoleName};
  roleManager.Create(identityRole);
}
var instructorName = "instructor@contonso.com";
if (!context.Users.Any(u => u.UserName == instructorName))
{
  var userStore = new UserStore<ApplicationUser>(context);
  var userManager = new UserManager<ApplicationUser>(userStore);
  var applicationUser = 
    new ApplicationUser { UserName = instructorName };
  userManager.Create(applicationUser, "init_2014");
  userManager.AddToRole(applicationUser.Id, 
    FrontClass.MvcApplication.AdministratorRoleName);
}

Yo también he sembrado las tablas relacionadas con el módulo con algunos datos de la muestra, que se pueden ver en la descarga que acompaña a este artículo. Cuando se inicia la aplicación, yo puedo iniciar sesión con el nombre de usuario instructor@contonso.com usando la contraseña init_2014. En este punto, tengo mis estructuras de datos en el lugar, la aplicación está configurada con múltiples contextos para utilizar la misma base de datos y tengo un usuario administrativo — la cuenta instructor — que puede iniciar sesión.

Capacidades básicas de edición la última pieza necesaria para permitir la composición real del curso es proporcionar el crear, leer, actualizar y eliminar las capacidades (CRUD). Que crear una nueva área llamada administración en la raíz de mi proyecto y utilizar las herramientas de andamiaje incorporado para construir la interfaz de usuario. Por último, crear un controlador de Admin con la acción de un índice y una vista que proporciona enlaces a curso mantenimiento, módulos y pasos.

Instruir el curso

Como el instructor, puede elegir un curso de la misma vista de administración, de la cual usted elegiría entonces un módulo. Cada uno de los pasos se muestran en la página posterior del módulo, como se puede ver en figura 4. Puedes enviar cualquier paso a cualquier alumno en el aula virtual con una vista previa de los contenidos disponibles para el instructor.

Conduct the Class
Figura 4 conducta la clase

Los estudiantes podrían estar en una sesión de la Conferencia, en un salón de clases con un instructor, o difundido en el mundo. Un contexto en el que necesitas esta aplicación sería un aula virtual vivo, en línea con decenas o incluso centenares de estudiantes. Quiero asegurar que sin importar lo que pueda necesitar adecuar la aplicación, no perder la capacidad de escalar. Así que tengo que considerar cómo la carga útil lección conseguirá realmente al estudiante.

Puede crear los pasos dentro de un módulo del curso como texto sin formato o HTML, y cada paso puede ser una longitud arbitraria. SignalR hace un gran trabajo de manejo de los mecanismos de negociación de transporte (con WebSockets, eventos enviados por el servidor, tiempo de votación o para siempre el marco) y abstrae la necesidad de preocuparse acerca de serialización de mensaje.

En definitiva, para seguir siendo escalable, necesito mantener mis mensajes pequeños. Esto es para minimizar la demanda de los recursos del servidor, reducir los costes de la serialización, el navegador del cliente aprovechar las piezas de infraestructura como el almacenamiento en caché y usar SignalR en la misma línea de su diseño: para la señalización.

La mejor manera de lograr esto es simplemente enviar un mensaje al cliente diciendo, "el nuevo contenido está disponible aquí", en lugar de enviar el paso de toda clase a lo largo. Considere el siguiente mensaje serializado como recibida por el cliente en el JSON aquí:

{"H":"ModuleStepHub", "M":"updateStep",
  "A":["\n<h1>Welcome to the course!</h1><p>trimmed for brevity...</p>\n"]}

Ese mensaje lleva HTML como la carga de argumento para el método updateStep del lado del cliente. Ese texto "recortado por brevedad" es la fuente de preocupación. El contenido podría crecer dramáticamente dependiendo de cómo un instructor crea un paso. Por ahora, esto es un mensaje de texto. Puedes imaginar cómo crecería el tamaño del mensaje si has intentado enviar páginas de contenido o de una imagen a la tubería. El texto o la imagen sería serializará como JSON y entregado a cada cliente utilizando los recursos señalización de tubería. En cambio, sólo quiero enviar la señal, particularmente el nuevo identificador contenido debe cargar el navegador. Ese mensaje considerablemente menor quedaría así:

{"H":"ModuleStepHub","M":"notifyStepAvailable","A":[7]}

Ahora que sé lo que estoy tratando de cumplir con mis mensajes, yo puedo construir esta funcionalidad en mi aplicación.

**Crear el centro:**Añadir una carpeta Hub a mi proyecto, entonces agregue una clase de centro de SignalR (v2) desde el cuadro de diálogo Agregar nuevo elemento. Un hub es la pieza del lado del servidor de SignalR se crea para publicar mensajes y manejar llamadas del cliente. Esta ruta, Visual Studio tira en mis dependencias y andamios una clase con un método de la muestra en mi centro. Me quite el método de la muestra y crear uno nuevo que me permite enviar un mensaje con el código siguiente:

public void MakeStepAvailable(int stepId)
{
  Clients.Others.
notifyStepAvailable(stepId);
}

La premisa aquí es que el instructor del curso invocará a algún tipo de acción que envía el paso a lo largo de los estudiantes. Usando los otros propiedad dinámica en los clientes objeto, digo SignalR para enviar el ID de paso a todos los demás clientes conectados. SignalR proporciona un número de tales opciones de filtrado así puedo actualizar un usuario específico, un grupo de usuarios o algún otro trozo de clientes conectados. El centro también permite instructores empezar un nuevo módulo. Los estudiantes pueden obtener la lista de pasos a su disposición por el instructor.

Mapa de centros de SignalR para exponer la funcionalidad de crear en mi hub, tengo que meter SignalR como mi solicitud está empezando. Una llamada a MapSignalR configura un endpoint por defecto que sirve un proxy de JavaScript. Cuando se incluyen en el cliente, éste invoca métodos de lado del servidor del cliente y viceversa. La carpeta raíz de mi proyecto incluye una clase OWIN Startup donde hago el llamado a hacer el cableado en el método de configuración. Esto es lo que parece después de los cambios:

public void Configuration(IAppBuilder app)
{
  ConfigureAuth(app);
  app.MapSignalR();
}

Es importante que llame a ConfigureAuth aquí primero. El gasoducto OWIN empuja los mensajes a través de middleware en el orden que se registra el middleware. En nuestro caso, queremos autenticación y autorización para ocurrir antes llamadas lleguen a nuestro Hub.

Permiten compartir para permitir que el instructor compartir contenido, añadir otro controlador a la aplicación llamada InstructController. Esto tiene sólo una acción de índice. He condecorado la clase con el atributo de autorizar, así que sólo los administradores pueden controlar el aula. La acción de índice acepta una identificación como un parámetro, la ruta para el cual está configurada en mi clase App_Startup\RouteConfig.cs. El método busca el módulo de la base de datos y devuelve el expediente a la vista con la colección de medidas incluida en la consulta.

En la vista correspondiente (ubicada en Views\Instruct\Index.cshtml), simplemente generar un botón Share para cada paso. Yo uso un atributo id-datos para almacenar el ID del paso. Que incluyen la biblioteca de SignalR y el proxy de eje expuesto en el paso anterior y escribir una pequeña cantidad de JavaScript para poner en marcha el proxy y controlar los eventos de clic desde el instructor, tal y como se muestra en la figura 5.

Figura 5 JavaScript para puesta en marcha del Proxy y manejar eventos de clic

    <script src="~/Scripts/jquery.signalR-2.0.3.js"></script>
    <script src="~/SignalR/Hubs"></script>
    <script>
      $(function() {
        var hub = $.connection.moduleStepHub;
        $.connection.hub.start().done(function() {
          $(".share-step").click(function() {
            var stepId = $(this).attr("data-id");
              hub.server.makeStepAvailable(stepId);
          });
        });
      });
    </script>

Por último, modificar mi página Índice administrativos para incluir la lista de cursos y módulos de los cuales puede elegir el instructor. La interfaz final, como se muestra en figura 6, permite el instructor salte a un módulo e iniciar la enseñanza.

The Administrative Interface for FrontClass
Figura 6 la interfaz administrativa de FrontClass

Usando la vista del módulo de figura 4, el instructor puede entonces enviar contenido a la clase.

Participación en clase

Como estudiante, la historia es mucho más simple. Aparecer! Cada estudiante tendrá que registrarse para acceder al sitio y recibir instrucciones para el módulo del curso activo que necesitan para ingresar el código de acceso. El proceso de registro es atendido por el controlador de cuentas por defecto en mi proyecto. Usted necesitará crear contenido a la página que aloja la lección y escribir el código necesario para que los estudiantes participen en la clase. Para que los estudiantes a las aulas cuando una clase está activa, debe haber primero matriculado para el curso.

Construir el controlador de clase clic derecho en la carpeta de controladores en el directorio raíz del proyecto me permite agregar un nuevo controlador y asígnele el nombre ClassroomController. Los dos métodos principales que añadir a esta clase son índice, donde se sirve el contenido principal, y GetModuleStep, que devuelve el paso requerido después de reunirse con un número de condiciones previas. Una tercera acción maneja casos donde no hay ningún módulo activo para la clase. Para acceder a materiales de módulo, un estudiante debe iniciar sesión el sitio y matriculado en el curso del módulo activo.

Permitir la inscripción curso el ClassroomController es deco­clasificado con un EnrollmentVerficationFilter que he creado para asegurar que los estudiantes sólo pueden acceder a cursos para los que tienen el código establecido por el instructor. Si el usuario aún no ha inscrito o instructor no ha iniciado un módulo, entonces los estudiantes se redirigen a la acción de índice en el EnrollmentController, como se puede ver en figura 7. Los estudiantes pueden inscribirse en un curso con el código apropiado. Sobre la inscripción exitosa, agrego un reclamo a la cuenta de usuario utilizando los componentes de identidad ASP.NET pertinentes.

The Course Lobby and Enrollment Page
Figura 7 el Lobby del curso y la página de afiliación

Añadir un reclamo a través de la clase UserManager, a la que gano acceso a una instancia de mi ApplicationDbContext y utilizando para construir un UserStore, que se transmite en mi clase de destino:

var context = new ApplicationDbContext();
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);

Una vez que tengo el componente necesario en su lugar, me da ID del usuario a través de la directora que representa su identidad y construir un objeto de reclamación. Luego se sumaran a la cuenta del usuario:

var userId = User.Identity.GetUserId();
var courseClaim = new Claim(MvcApplication.CourseRegistrationClaimUrn,
  enroll.CourseId.ToString(CultureInfo.InvariantCulture));
userManager.AddClaim(userId, courseClaim);

Con el reclamo en lugar de en la cuenta del usuario, un estudiante puede ahora acceder al aula.

Examinar la vista aula como se puede ver en figura 8, la clase se divide en dos partes. La parte superior de la página ofrece una visión general del módulo actual y proporciona un control para saltar a cualquier paso disponible. La sección inferior se llama la pizarra y muestra el contenido compartido por el instructor.

The Virtual Chalkboard
Figura 8 la pizarra Virtual

Esta pagina realmente sólo tiene un par de elementos DIV como contenedores de contenido. El resto se conectaron vía JavaScript y a través de contenido traído basado en los mensajes provenientes de la ClassroomHub o selección del estudiante de un paso previo. Como el instructor selecciona nuevos pasos, el ClassroomHub es notificado y envía señales a todos los que están en el aula. Esto a su vez recupera datos de la ClassroomController, permitiendo así el almacenamiento en caché.

Implementar el proyecto

El instructor puede crear y administrar cursos, módulos y pasos. Un estudiante puede inscribirse en el sitio y se inscriban en cursos. Cursos están protegidos a través de demandas de inscripción, y pizarra virtual del aula se actualiza con el contenido según lo dirigido por el instructor. Tiempo para enviar!

En el menú generar, seleccionar la opción de publicar mi proyecto. Aparece el cuadro de diálogo publicar Web y elegir Azure sitios Web como el objetivo de publicar. Visual Studio me solicita mis credenciales si no ya lo he firmado. Entonces puedo elegir el sitio existente que he creado en el inicio de este proyecto. Mi perfil editorial es entonces descargado, completo con las cadenas de conexión de base de datos previamente configurado y todas las credenciales necesarias para enviar mi sitio a Azure.

Al principio de este proyecto, preparó primero mi sitio en el Portal de Azure. Porque este proyecto utiliza la cadena de conexión DefaultConnection, ya está presente en mi perfil editorial, no necesito realizar cambios cuando voy a la producción. La cadena de conexión de producción automáticamente puntos de mi solicitud en previamente configurado SQL Azure Database.

Tomar ventaja de los sitios Web azules

Publicar un sitio web a un extremo preconfigurado en sitios Web de Azure fue una grata sorpresa. Fue realmente fácil. Después de años de sobrevivir con mucho más complicados procedimientos de implementación, esto sin duda fue un regalo. Esto solo no es el final del juego para sitios Web de Azure. Existen muchas más herramientas disponibles:

  • Agregar un dominio personalizado: Si usted puede registrar un dominio y configurar un par de registros DNS, solo toma minutos para agregar un dominio único de su elección a su sitio. Leer más sobre esto en bit.ly/1sV8R1y.
  • Garantizar la aplicación: Certificados basados en el SNI son pagar­capaz, y puede añadirlos a través del salpicadero de su sitio Web de Azure. Leer más sobre esto en bit.ly/1mYXndJ.
  • Escalar el sitio: Si encuentras que tu proyecto va creciendo, usted tiene la opción para escalar (hardware más potente) o fuera (más instancias). Don' t olvidar también configurar Azure Service Bus para manejar el tráfico de su SignalR. Leer más sobre SignalR en bit.ly/1o6B7AC.
  • Añadir continuo despliegue: Para los proyectos más pequeños, yo renunciar implementación directa y usar un servidor de control de fuente basado en Git. Azure entonces crea, etapas y despliega automáticamente mi sitio en el check-in. Leer más sobre esto en bit.ly/1o6BACT.
  • Añadir monitoreo y alertas: Siempre es mejor que cuando algo no va bien en su aplicación. Puede ver para ciertos tipos de problemas y obtener notificaciones como suceden, todo configurado del salpicadero de su sitio.

Resumen

En este artículo, he usado ASP.NET 2.0 de identidad, que ahora es parte de la plantilla por defecto ASP.NET MVC en Visual Studio 2013. Para obtener más información acerca de las mejoras y cambios, por favor revise el post sobre el desarrollo Web .NET y herramientas Blog en bit.ly/PXgQ2d. También usé SignalR para permitir la comunicación en tiempo real entre el cliente y el servidor. Esto automáticamente genera a proxys de JavaScript e invoca el código en el servidor del cliente y viceversa. Para más información sobre cómo crear el modelo de datos usando EF con código primero en una aplicación MVC 5 ASP.NET , visite el tutorial en bit.ly/1pivbmE.

Experiencias ricas son mucho más fáciles entregar cuando no tienes que cuidar la infraestructura subyacente o la complejidad de la implementación. La aplicación FrontClass aprovecha la autenticación, autorización, mensajería en tiempo real y un almacén de datos persistente. Como desarrollador, tengo muchos de estos bloques de construcción gracias a los esfuerzos de los demás. No tengo que preocuparse por las otras partes móviles como muevo mi proyecto en producción.

James Cámaras es un MVP de Microsoft en ASP.NETIIS y orador frecuente en conferencias y grupos de usuarios a través de Canadá. Él es el autor de "Windows Azure Web Sites" (Wrox, 2013), disponibles a través de eBook (bit.ly/wawsbook) y presentado en el Microsoft Virtual Academy (bit.ly/wawsmva). Blog en jameschambers.com y se le puede llegar en Twitter en twitter.com/CanadianJames.

Gracias a los siguientes expertos técnicos por su ayuda en la revisión de este artículo: Chad McCallum (Consultor independiente)