Este artigo foi traduzido por máquina.

Sites do Azure

Ensinando pela nuvem

James Chambers

Baixar o código de exemplo

Este é um momento emocionante para ser um desenvolvedor Web. A-to-end a tarefa de criar um projeto e implantá-lo em um ponto de extremidade voltado para o público é realmente um desafio que já foi assustadora, talvez até mesmo proibitivo. Ainda hoje se ergue como um dos computing "resolvido" desafios.

Com poucos recursos, você pode baixar uma IDE livre e ferramentas de controle de origem. Você pode iniciar um projeto e implantá-lo em uma rica infra-estrutura, mantida para você sem precisar de acesso ou conhecimento do hardware. Você pode ter seu projeto hospedado sem nenhum custo para começar.

Nós temos que trabalhar com os blocos de construção são mais abrangentes do que nunca — se PHP, Java ou o Microsoft .NET Framework. Agora podemos focar o UX em vez de escalabilidade, redes, armazenamento, procedimentos de implantação ou gerenciamento de projetos.

FrontClass, o aplicativo coberto neste artigo, é algo que há décadas teria sido semanas de trabalho, se não mais. Teria sido difícil começar a trabalhar em todos os ambientes. Implantação teria sido um pesadelo. E, provavelmente, não foi capaz de resolver a escalabilidade nesse quadro de tempo. Hoje, pode compilar o projeto e tê-lo implantado em horas e pronto para escala. A solução para download contém o código-fonte completo, trabalhando que você pode implantar sem ter que modificar a sua própria conta Microsoft Azure.

Comecei a FrontClass enquanto o voluntariado em um local junior high school, ensino de programação para crianças de 10 a 14 anos. Eu queria compartilhar conteúdo com os alunos de uma forma que poderia controlar o ritmo, mas deixá-los voltar ao anterior passos sob demanda. Existem três áreas funcionais do aplicativo que ajudam o professor conduzir uma classe: composição de lição, participação de instrução e aluno de sala de aula. Eu vou quebrar para baixo de cada uma dessas áreas, mas, naturalmente, há alguma sobreposição.

Projeto básico

Para compilar o aplicativo, eu vou usar Visual Studio 2013 Update 2. Também vou usar o aplicativo da Web do ASP.NET ao criar a solução e o modelo MVC ASP.NET . O projeto gerado a partir do modelo usará a estrutura de front-end Bootstrap popular para denominar e algumas funcionalidades da interface do usuário.

Para habilitar a funcionalidade em tempo real, vou adicionar os pacotes SignalR e usar ferramentas já são bem conhecidas para Visual Studio. Também vou usar as bibliotecas necessárias jQuery nas páginas de cliente. Configurarei o Estrutura de Entidade (EF) usar LocalDb por padrão na desenvolver­mento ambiente, mas quando implantar a Azure Web Sites, eu vou estar usando banco de dados SQL Azure como armazenamento de dados. Comecei o projeto, no entanto, no Portal do Azure (portal.azure.com), onde eu posso configurar meu destino de implantação.

Crie o Site do Azure no canto inferior esquerdo do Portal, clique em novo e selecione o site + SQL modelo, como mostrado na Figura 1. Azure irá criar um conjunto de recursos vinculados. Selecione um nome apropriado para este grupo e o nome do aplicativo. Posso escolher criar um novo servidor de banco de dados ou selecione um existente na minha conta para criar o banco de dados para o meu site. É recomendável ter o banco de dados e o site da mesma zona para reduzir os tempos de tráfego de rede.

Create a New Azure Web Site with Linked Database
Figura 1 criar um novo Site azul com Banco de dados vinculado

No meu caso, liguei para o grupo de recursos de ELearning, banco de dados FrontClass_DB e o site FrontClass. Você precisará escolher um nome de site único. Concluído o provisionamento, fico com o frontclass.azurewebsites. NET host e o meu destino de implantação está pronto para hospedar meu site.

Apesar da aparência de acontecimentos mágicos, realmente não há muito que deveria surpreendê-lo aqui. Criei uma entrada DNS, mapeado um nome de host para um endereço IP e fez algumas opções de configuração como documentos padrão e seqüências de conexão. Estas são essencialmente as coisas que estaria fazendo no IIS nos bastidores para ter seu site funcionando. Então, novamente, não é mágica, mas é bastante conveniente. Existem também algumas ferramentas de infra-estrutura-tipo como fonte controle e implantação de scripts disponíveis para ajudar você a começar.

Criar a solução em seguida, entra em Visual Studio e selecione o aplicativo da Web ASP.NET acima mencionados como base para minha solução. Como escolher o tipo de projeto para criar — usando o modelo MVC ASP.NET — eu também obter opções para criar os recursos relacionados no Azure. Já criei o site e banco de dados através do Portal, então desmarque a caixa de seleção e prosseguir com a criação do site.

Compor módulos do curso

Por causa do escopo deste projeto, eu sou capaz de manter um modelo de dados bastante simples. Eu uso EF6 para criar os modelos através do primeiro código, que deixa a porta aberta para as modificações na estrada usando as migrações de dados. O resultado final, mostrado na Figura 2, é um simples conjunto de classes que representam as estruturas de curso, módulo e passo.

The Basic Application Data Model
Figura 2 modelo de dados de aplicativo básico

Há um pouco de cerimônia para percorrer toda a fiação para onde eu quero. Ou seja, eu quero usar um único banco de dados, eu quero ser capaz de controlar quando as migrações são geradas e eu quero que meu aplicativo para executar automaticamente qualquer migrações pendentes na inicialização do aplicativo.

Isso me permite controlar explicitamente as alterações que aparecem em cada migração. Ele também permite que meu aplicativo atualizar-se sem intervenção. Também estabelecerá um meio para preencher previamente o banco de dados com a função de administrador e o papel de instrutor (o primeiro e somente o usuário administrativo) por meio da substituição de semente na classe de configuração.

Especificar uma seqüência de conexão Estrutura de Entidade me deixa usar o mesmo banco de dados com diferentes contextos e migrações dentro de uma seqüência de conexão única. Chamando o construtor de classe base e passando em um nome, o quadro vai olhar primeiro para o aplicativo ou configuração da Web para ver se há uma seqüência de caracteres de conexão definida pelo mesmo nome. Em caso afirmativo, ele usará para fazer a conexão.

História de migração para cada contexto é mantida, registrando o namespace como parte do processo de atualização. Isso ajuda a minhas migrações executar independentemente uns dos outros. Para configurar isso, adicionei um construtor padrão para a minha classe de contexto como segue:

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

Se você olhar para o contexto criado como parte do modelo de projeto localizado no arquivo IdentityModels.cs, você verá que há um construtor padrão semelhante presente. Ele é um pouco modificado para refletir a natureza da classe base IdentityDbContext, mas ainda usa a seqüência de conexão DefaultConnection do arquivo Web. config.

Habilitar migrações gerou a classe de configuração para as entidades criadas executando o seguinte comando do Console do Gerenciador de Pacotes em Visual Studio:

Enable-Migrations -ContextTypeName FrontClass.DAL.FrontClassContext

Ilumina-se migrações para meu curso...­entidades relacionadas. Eu quero fazer o mesmo para o ApplicationDbContext, também. Eu poderia correr o comando novamente com o nome de classe foram trocado. No entanto, quando habilito a configuração, migrações e semeadura no contexto onde as contas são armazenadas, não quero substituir a classe de configuração anteriormente scaffolded. Em vez disso, eu especificar um diretório alternativo para as migrações, como segue, com as migrações­Directory parâmetro passado para o comando:

 

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

Adicionar as primeiras migrações o próximo passo é simplesmente andaime as classes Estrutura de Entidade irá executar. Eu uso o seguinte comando duas vezes, uma vez para cada DbContext para o qual desejo criar uma migração:

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

Mais uma vez, trabalhando com vários contextos adiciona um pouco de complexidade porque você tem que especificar o parâmetro ConfigurationTypeName. Caso contrário, esta é uma operação simples.

Definir a estratégia de inicialização do banco de dados para configurar o EF para executar automaticamente o meus migrações, preciso diga qual a estratégia a utilizar antes de realizar qualquer acesso de banco de dados. Sem fazê-lo, eu vou receber mensagens de exceção em tempo de execução que indicam o que meu modelo está fora de sincronizado com o banco de dados. Cada mudança de minhas aulas afeta o hash calculado do meu modelo de dados, que é controlado no banco de dados.

No meu global. asax, adicionei as seguintes duas linhas de código para usar o inicializador de MigrateDatabaseToLatestVersion:

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

Nota que eu estou chamando o método genérico SetInitializer que aceita o contexto que deseja configurar. No meu caso, minhas aulas de configuração são nome semelhante para que especifiquei os nomes de classe totalmente namespaced.

As tabelas de sementes na primeira corrida, eu quero ser capaz de proporcionar uma experiência que permite que alguém "faça login" e começar a usar o app. Eu poderia criar um controlador de execução única semelhante ao que você encontraria em aplicações populares de blogging. Outra opção é usar os métodos de semente em minhas classes de configuração. O método de semente é passado em uma instância do contexto adequado, do qual eu posso manipular as tabelas.

Com identidade ASP.NET 2.0, recebo também um rico conjunto de classes que estão cientes do EF. Isso me deixa condicionalmente injetar o papel e o usuário no banco de dados, como eu estou fazendo Figura 3.

Figura 3 semeando o primeiro papel e usuário 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);
}

Eu também tenho semeado as relacionados com o módulo tabelas com alguns dados de exemplo, que você pode ver no download que acompanha este artigo. Quando o aplicativo é iniciado, eu consigo fazer login com o username instructor@contonso.com usando a senha init_2014. Neste ponto, eu tenho minhas estruturas de dados no local, o aplicativo é configurado com vários contextos para usar o mesmo banco de dados e eu tenho um usuário administrativo — conta o instrutor — que pode logar.

Recursos básicos de edição de o último pedaço necessário para permitir a composição real do curso é fornecer a criar, ler, atualizar e excluir recursos (CRUD). Eu criar uma nova área chamada administração na raiz do meu projeto e usar as ferramentas de andaime interno para construir a interface do usuário. Finalmente, criar um controlador de Admin com uma ação de índice e uma vista que fornece links para manutenção do curso, módulos e etapas.

Instruir o curso

Como o instrutor, você pode escolher um curso do mesmo vista de administração, do qual você escolheria então um módulo. Cada uma das etapas são exibidos na página do módulo subseqüente, como você pode ver na Figura 4. Você pode enviar qualquer passo para qualquer aluno em sala de aula virtual com uma pré-visualização do conteúdo disponível para o instrutor.

Conduct the Class
Figura 4 conduta classe

Os alunos poderiam estar em uma sessão de conferência, em uma sala de aula com um instrutor, ou espalhados ao redor do mundo. Um contexto em que você poderia usar este aplicativo seria uma aula virtual on-line, ao vivo, com dezenas ou mesmo centenas de estudantes. Eu quero garantir que, independentemente de como você pode precisar adaptar o aplicativo, você não perde a capacidade de escalar. Então eu tenho que considerar como a carga de lição na verdade vai para o aluno.

Você pode criar as etapas dentro de um módulo do curso como texto sem formatação ou HTML, e cada passo pode ser um comprimento arbitrário. SignalR faz um ótimo trabalho de lidar com a mecânica de negociação de transporte (com WebSockets, eventos servidor-enviou, sondagem muito tempo ou para sempre o quadro) e ele abstrai a necessidade de se preocupar com a serialização de mensagem.

Em última análise, para se manterem escalável, preciso manter minhas mensagens pequenas. Isto é para minimizar a demanda sobre os recursos do servidor, reduzir os custos de serialização, deixe o navegador do cliente aproveitar partes da infra-estrutura, tais como cache e usar SignalR na mesma linha de seu projeto: para sinalização.

A melhor maneira de conseguir isso é simplesmente enviar uma mensagem para o cliente dizendo, "novo conteúdo está disponível aqui," em vez de enviar o passo lição inteira. Considere a seguinte mensagem serializada como recebido pelo cliente no JSON aqui:

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

Essa mensagem carrega o HTML como a carga de argumento para o método updateStep do lado do cliente. Esse texto "aparadas para abreviar" é a fonte da preocupação. O conteúdo poderia crescer dramaticamente dependendo de como um instrutor criado um passo. Por agora, este é apenas um texto. Você pode imaginar como o tamanho da mensagem iria crescer se você tentou enviar páginas de conteúdo ou uma imagem do cano. O texto ou imagem iria ser serializada como JSON e entregues a cada cliente, utilizando os recursos de pipeline a sinalização. Em vez disso, só quero enviar o sinal, particularmente o novo ID conteúdo que o navegador deve carregar. Essa mensagem consideravelmente menor ficaria mais assim:

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

Agora que eu sei o que estou tentando realizar com minhas mensagens, pode construir esta funcionalidade no meu aplicativo.

**Crie o Hub:**Adicionar uma pasta de Hub para meu projeto, em seguida, adicionar uma classe de Hub SignalR (v2) na caixa de diálogo Adicionar Novo Item. Um hub é a peça do lado do servidor de SignalR que você cria para publicar mensagens e identificador de chamadas do cliente. Esta rota, Visual Studio puxa em minhas dependências e moldes de uma classe com um método de amostra no meu hub. Eu remover o método de amostra e criar um novo que me permite enviar uma mensagem com o código a seguir:

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

A premissa aqui é que o instrutor do curso irá invocar algum tipo de ação que envia o passo em frente para os alunos. Usando os outros propriedade dinâmica nos clientes objeto, digo SignalR para enviar o ID de passo para todos os outros clientes conectados. SignalR fornece um número de tais opções de filtragem para que eu possa atualizar um usuário específico, um grupo de usuários ou alguma outra fatia de clientes ligados entre si. O hub permite também instrutores iniciar um novo módulo. Os alunos podem obter a lista de etapas disponibilizado pelo instrutor.

Mapear os Hubs SignalR para expor a funcionalidade para criar em meu hub, preciso picar SignalR como meu aplicativo está começando. Uma chamada para MapSignalR define um ponto de extremidade padrão que serve um proxy JavaScript. Quando incluído no cliente, isso chama métodos do lado do servidor do cliente e vice-versa. A pasta raiz do meu projeto inclui uma classe de inicialização OWIN onde fazer a chamada para fazer a fiação no método de configuração. É assim que é após as minhas alterações:

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

É importante chamar ConfigureAuth aqui primeiro. O pipeline OWIN envia mensagens através de middleware na ordem que o middleware é registrado. No nosso caso, queremos a autenticação e autorização para ocorrer antes chamadas alcançar nosso Hub.

Habilitar o compartilhamento para que o instrutor compartilhar conteúdo, adicionar outro controlador para o aplicativo chamado InstructController. Este tem apenas uma ação de índice. Já decorei a classe com o atributo de autorizar, para que apenas os administradores podem controlar a sala de aula. A ação do índice aceita um ID de módulo como um parâmetro, o caminho para o qual está configurado na minha aula de App_Startup\RouteConfig.cs. O método procura o módulo de banco de dados e retorna o registro para a visualização com a coleção de etapas incluída na consulta.

Na exibição correspondente (localizada em Views\Instruct\Index.cshtml), eu simplesmente gerar um botão de compartilhamento para cada etapa. Eu uso um dados-id atributo para armazenar o ID da etapa. Incluir a biblioteca SignalR e o proxy de hub expostos na etapa anterior, em seguida, escrever uma pequena quantidade de JavaScript para iniciar o proxy e manipular eventos de clique do instrutor, como mostrado na Figura 5.

Figura 5 JavaScript para iniciar o Proxy e manipular eventos de clique

<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>

Finalmente, posso modificar a minha página de índice administrativo para incluir a lista de cursos e módulos de que o instrutor pode escolher. A interface final, como exibido no Figura 6, permite que o instrutor saltar directamente para um módulo e começar a ensinar.

The Administrative Interface for FrontClass
Figura 6 a Interface administrativa para FrontClass

Usando o modo de exibição do módulo de Figura 4, o instrutor pode então enviar o conteúdo para a classe.

Participação nas aulas

Como estudante, a história é muito mais simples. Só aparece! Cada aluno precisará se cadastrar para acessar o site e receber instruções para o módulo de curso ativo precisam para digitar a senha. O processo de registro é tratado pelo controlador conta padrão no meu projeto. Eu precisarei criar a página que hospeda a lição conteúdo e escrever o código necessário para os estudantes para participar da aula. Para estudantes para se juntar a sala de aula, quando uma classe é ativa, que devem ter primeiro inscritos para o curso.

Construir o controlador da sala de aula botão direito do mouse sobre a pasta de controladores na raiz do projeto me permite adicionar um novo controlador e o nome ClassroomController. Os dois métodos primários que adicionar a esta classe são índice, onde será servido o conteúdo principal, e GetModuleStep, que retorna a etapa solicitada após a reunião de um número de condições prévias. Uma terceira ação lida com casos onde não há nenhum módulo ativo para a classe. Para acessar os materiais do módulo, um estudante deve ser autenticado site e se matriculou no curso do módulo ativo.

Permitir a inscrição de curso ClassroomController The é deco­Pontuação: com um EnrollmentVerficationFilter que eu criei para garantir que os alunos só podem acessar cursos para os quais eles têm o código de entrada definido pelo instrutor. Se o usuário ainda não matriculados ou instrutor ainda não começou um módulo e, em seguida, os alunos são redirecionados para a ação de índice sobre o EnrollmentController, como você pode ver na Figura 7. Os alunos podem se inscrever em um curso com o código de entrada apropriada. Mediante inscrição bem sucedida, para adicionar uma declaração para a conta de usuário usando os componentes de identidade relevantes ASP.NET .

The Course Lobby and Enrollment Page
Figura 7 da página de inscrição e curso Lobby

Para adicionar uma declaração através da classe UserManager, ao qual eu ganho acesso obtendo uma instância de meu ApplicationDbContext e usar isso para construir um UserStore, que depois é passado em minha classe de destino:

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

Assim que eu tiver o componente necessário no lugar, eu passar o ID do usuário principal que representa sua identidade e construir um objeto de reivindicação. Em seguida, adiciono que a conta do usuário:

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

Com o crédito no lugar sobre a conta do usuário, um estudante pode agora acessar a sala de aula.

Examinar a vista da sala de aula como você pode ver na Figura 8, a sala de aula é dividida em duas partes. O topo da página dá uma visão geral do módulo atual e oferece controles para saltar para qualquer passo disponível. A seção inferior chama-se o quadro-negro e exibe o conteúdo compartilhado pelo instrutor.

The Virtual Chalkboard
Figura 8 a lousa Virtual

Esta página realmente só tem um par de elementos DIV como recipientes de conteúdo. O resto é ligado via JavaScript e através de conteúdo buscado com base em mensagens provenientes da ClassroomHub ou a seleção do estudante de uma etapa anterior. Como o instrutor seleciona novos passos, o ClassroomHub é notificado e envia sinais para todos os que estão na sala de aula. Este por sua vez busca os dados desde o ClassroomController, permitindo assim o armazenamento em cache.

Implantar o projeto

O instrutor pode criar e gerenciar cursos, módulos e etapas. Um estudante pode registar-se para o site e se inscrever em cursos. Cursos são protegidos através de declarações de inscrição, e lousa virtual da sala de aula é atualizada com conteúdo conforme indicado pelo instrutor. Tempo para enviar!

No menu Build, eu seleciono a opção para publicar meu projeto. É exibida a caixa de diálogo Publicar Web, e eu escolho o Azure Web Sites como o destino de publicar. Visual Studio me solicita minhas credenciais se não já assinei. Então eu posso escolher o site existente que criei no início deste projeto. Meu perfil de publicação é então descarregado, completo com as seqüências de conexão de banco de dados pré-configurado e todas as credenciais necessárias para enviar meu site para Azure.

No início deste projeto, primeiro preparei meu site no Portal do Azure. Porque este projeto usa a seqüência de conexão DefaultConnection, já presente no meu perfil de publicação, não preciso fazer alterações quando eu ir para produção. A seqüência de caracteres de conexão de produção automaticamente pontos meu aplicativo no banco de dados SQL Azure previamente configurados.

Tire partido da Azure Web Sites

Um site de publicação de um ponto de extremidade pré-configurado no Azure Web Sites foi uma surpresa bem-vinda. Foi realmente fácil. Depois de anos de sobreviver com os procedimentos de implantação muito mais complicados, isto era certamente um deleite. Sozinho não é o fim do jogo para Azure Web Sites. Há muitas mais ferramentas disponíveis:

  • Adicione um domínio personalizado: Se você pode registrar um domínio e configurar um par de registros DNS, leva apenas minutos para adicionar um domínio exclusivo de sua escolha para o seu site. Leia mais sobre isso em bit.ly/1sV8R1y.
  • Proteger o aplicativo: Certificados baseados em SNI são pagar­capaz, e você pode adicioná-los através do painel de controle do seu Site Web de Azure. Leia mais sobre isso em bit.ly/1mYXndJ.
  • Scale-Up o Site: Se você achar que seu projeto está crescendo, você tem a opção de scale-up (hardware mais poderoso) ou fora (mais instâncias). Don' t se esqueça de também configurar o barramento de serviço Azure para lidar com o tráfego de SignalR. Leia mais sobre SignalR em bit.ly/1o6B7AC.
  • Adicione a implantação contínua: Para mesmo os projetos menores, renunciar a implantação direta e usar um servidor de controle de fonte baseada em Git. Azure então cria, estágios e implanta automaticamente o meu site no check-in. Leia mais sobre isso em bit.ly/1o6BACT.
  • Adicionar monitoramento e alertas: É sempre melhor saber quando algo não vai bem em seu aplicativo. Você pode assistir para certos tipos de problemas e obter notificações como eles acontecem, todos configurados do painel de controle do seu site.

Conclusão

Neste artigo, eu usei ASP.NET 2.0 de identidade, que agora faz parte do modelo padrão ASP.NET MVC no Visual Studio 2013. Para saber mais sobre as mudanças e melhorias, por favor, confira o post sobre o desenvolvimento do .NET Web e ferramentas de Blog em bit.ly/PXgQ2d. Também usei SignalR para permitir a comunicação em tempo real entre o cliente e o servidor. Isto automaticamente gera proxies JavaScript e invoca código no servidor do cliente e vice-versa. Para obter mais informações sobre como criar seu modelo de dados usando o EF com o primeiro código em um aplicativo de MVC 5 ASP.NET , visite o tutorial em bit.ly/1pivbmE.

Experiências ricas são muito mais fáceis entregar quando você não tem que cuidar da infra-estrutura subjacente ou a complexidade da implantação. O aplicativo FrontClass aproveita a autenticação, autorização, em tempo real de mensagens e um armazenamento de dados persistente. Como um desenvolvedor, recebo muitos desses blocos de edifício, graças aos esforços dos outros. Não preciso se preocupar com as outras partes móveis como mudar meu projeto para produção.

James Câmaras é MVP da Microsoft em ASP.NET/IIS e palestrante freqüente em conferências e grupos de usuários em todo o Canadá. Ele é o autor de "Windows Azure Web Sites" (Wrox, 2013), disponível via eBook (bit.ly/wawsbook) e apresentou sobre o Microsoft Virtual Academy (bit.ly/wawsmva). Blogs de He em jameschambers.com e você pode alcançá-lo no Twitter em twitter.com/CanadianJames.

Agradecemos ao seguinte especialista técnico pela revisão deste artigo: Chad McCallum (consultor independente)