Feed RSS em C# .NET Core no Azure Web App em Linux

Neste artigo vou demonstrar como criar uma aplicação web Model-view controller (MVC) que vai ler o Feed RSS dos artigos da Revista PROGRAMAR em C# .NET Core 1.1 para Docker. A aplicação vai ser disponibilizada no Azure Web App em Linux através Docker Hub.

Azure Web App

O serviço Azure Web App permite que uma aplicação web desenvolvida em .NET, .NET Core, Java, Node.js, PHP, Python e Ruby esteja disponível em qualquer utilizador através da Internet. Para alguns o Web App é uma forma de disponibilizar uma página de Internet ou framework mas permite muito mais do que isso mais a frente vou demonstrar algumas funcionalidades.

Azure App ServiceO Web Apps está integrado no Azure App Service que é um conjunto de serviços.

  • Web Apps, permite alojar websites e aplicações Web.
  • Mobile Apps, alojar aplicações mobile a back-ends.
  • Logic Apps, automatizar processos empresariais e integrar sistemas e dados no Azure sem escrever código.
  • API apps, para alojar RESTful APIs.
    Functions, executa pequenos pedaços de código ou “funções” no Azure.

 

Os recursos não são reservados a cada serviço os mesmos podem utilizar as funcionalidades dos outros serviços.

O Web App tem tudo o que necessita para construir uma aplicação esta oferece ao administrador de sistema, desenvolvedor ou DevOps uma plataforma totalmente gerida em que se tem acesso as várias funcionalidades por exemplo:

  • Always On, mantém a Web App ativa está disponível a partir do Standard tier.
  • Definições da aplicação e Connection Strings.
  • Registos de auditoria de servidor Web, ficheiros, mensagens de erro detalhadas e pedidos solicitados.
  • Backups Manuais e/ou agendados.
  • Gestão através de linhas de comandos com Azure PowerShell ou Azure CLI.
  • Deployment a partir do Visual Studio Team Services, OneDrive, Git, GitHub, Bitbucker, Dropbox, e outros repositórios externos.
  • Monotorização e diagnósticos.
  • Múltiplas Framework disponíveis .NET, PHP, Java, Python e Node.js.
  • Testes de desempenho.
  • Debug remota e por consola.
  • Controlo de acesso por funções, Role-Based Access Control (RBAC).
  • Scaling Up, Out ou automático.
  • Plataforma 32 ou 64 bit.
  • Extensões, por exemplo “Let’s Encrypt” que está disponível a partir do tier básico requer Server Name Indication (SNI).
  • Site Slots. pode ser utilizado como silo de vida da aplicação.
  • Certificados SSL.
  • WebJobs, executa tarefas manuais, agendadas, trigger ou contínuo.

Através da plataforma pode ativar ou desativar funcionalidades pretendidas e o Azure automaticamente faz toda essa configuração por nós. Isto é possível porque o Web App é uma plataforma como serviço (Plaform-as-a-Service) apenas gerimos a aplicação e os dados todos. A infraestrutura desde da rede, armazenamento, máquina virtual, sistema operativos, software necessário para executar a aplicação desde do IIS, Apache, Tomcat, ou outro é totalmente gerido pelo Azure e não temos que nos preocupar com manutenção e atualizações, mas a segurança da aplicação é da nossa responsabilidade.

O Azure já dispõe da sua versão em Linux que funciona com máquinas virtuais em Linux, antes estava apenas disponível em Windows. Agora podemos escolher se queremos executar a aplicação num ambiente Windows ou Linux. A versão em Linux foi um dos pedidos mais solicitadas pelos clientes/utilizadores porque há frameworks como o WordPress que funciona muito melhor e mais rapidamente em Linux do que em Windows.

A versão Windows e Linux não são iguais, existem diferenças entre eles. A grande diferença é que em Linux é utilizado o Docker o que permite que se possa utilizar o nosso próprio container que é um recipiente que contem todo o que é necessário para a aplicação ser executada. O Docker Hub é um repositório permite que a Web App seja atualizada automaticamente quando atualizamos a aplicação no Docker Hub, mas também podemos fazer o deployment da aplicação por FTP, Git, Bitbucket.

Outra diferença entre a opção Windows e Linux é o suporte de linguagens de programação em Linux apenas suporta (quando este artigo foi escrito) Node.js 4.4, 4.5, 6.2, 6.6, 6.9-6.11 e 8.0-8.1, o PHP 5.6 e 7.0, .NET Core 1.0-1.1 e o Ruby 2.3. Enquanto a versão Windows tem mais suporte e inclui o Java 7 e 8 e Python 2.7 e 3.4 mas não suporta Ruby.

Como funciona a arquitetura do serviço

Arquitetura do Serviço

O Azure tem dois clusters de computação na mesma rede virtual (VNET) o cluster primário é composto principalmente por tecnologia Microsoft que dispõem de um frontend load balancer que recebe todo tráfego Hypertext Transfer Protocol (HTTP) recebido que por sua vez reencaminha para máquinas ou serviços em ambiente Windows ou Linux, tem o Windows Web Workers que é utilizado para aplicações Windows, um serviço de armazenamento e muito mais. O segundo cluster apenas tem máquinas virtuais com Linux e é neste cluster que vão estar as aplicações Web App em Linux.

O que contém a máquina virtual em Linux?

Máquina Virtual Linux

A máquina contem um proxy que recebe todo o tráfego recebido pelo FrontEnd do cluster principal e o mesmo vai encaminhar para a aplicação a informação solicitada e enviada pelo Site Routing mas este faz muito mais do que enviar a informação ao cliente. O Site Routing gera a aplicação, se verificar que existe uma nova versão ele vai atualizar a mesma.

O container não inclui a informação persistente da aplicação. Cada Web App tem um serviço SCM associado, esse serviço é o Kudu que permite ter acesso a painéis de controlo com linhas de comandos, debug, diagnósticos, processos em execução ou seja permite fazer o deployment rápido. Kudu é um projeto de código aberto e que está disponível no GitHub (https://github.com/projectkudu/kudu) este serviço é executado num contentor a parte.

Kudu

Os dois containers estão separados através do isolamento de segurança do Docker mas integrados numa única bridge e todas as bridges estão associadas a um plano do serviço (Azure Service Plan).

Os dois containers acedem ao conteúdo da aplicação através do Message Block (SMB) de forma persistente o que significa que quando existe uma alteração é refletida em todos os lugares.  Se estiver a executar uma segunda aplicação Web App é criado uma segunda Bridge e por sua vez é criado um novo contentor Docker para aplicação e SCM.

Azure Web App para Containers

Além do Azure Web App em Linux também existe o Azure Web App para Containers mas qual é diferença entre eles? Basicamente o Web App para Containers permite utilizar o nosso próprio Container e efetuar deployment automaticamente, por nós, numa Web App para Linux, ou seja, é uma solução baseada em Web App em Linux mas com a vantagem que todo o processo vai ser feito automaticamente pelo Azure o que permite eliminar as tarefas de gestão. Continuamos a ter acesso à configuração do domínio, certificados SSL e muito mais. É um ambiente ideal para desenvolvedores e DevOps.

Deployment de um Docker Container para Azure Web App em Linux

Antes de iniciar é necessário ter instalado o Docker Community Edition que pode obter na página oficial do Docker Store em https://store.Docker.com/ é compatível com vários sistemas operativos, o .NET Core pode ser obtido em https://www.microsoft.com/net/download/core apesar de ser compatível com o Linux por experiência própria não funciona muito bem com o Fedora 23 e 24, devido a bibliotecas que o próprio Fedora utiliza. Pode alterar mas algumas aplicações instaladas podem deixar de funcionar. Para ambiente de desenvolvimento integrado (IDE) recomendo a utilização do Microsoft Visual Studio 2017. Se utilizar ambientes Linux recomendo o Microsoft Visual Studio Code. Sobre o Visual Studio a versão Community 2017 é igual à versão Professional mas apenas pode ser utilizado por estudantes, projetos de código aberto e desenvolvedores individuais, o Code pode ser utilizado por todos incluindo qualquer projeto empresarial. Neste artigo utilizei o Microsoft Visual Studio 2017. Se utilizar o Visual Studio Code recomendo que instale as seguintes duas extensões Azure Extensions Pack e Docker.

Visual Studio Code Azure Extension Pack + Docker Extension

Criação do projeto C# .Net Core 1.1

No Visual Studio é criado um novo projeto ASP.Net Core 1.1 Web Application MVC este projeto já inclui código para efeitos de demonstração pode manter-se esse código ou fazer alterações ao mesmo. O Visual Studio fornece a hipótese de adicionar suporte ao Docker para o sistema operativo em que vai ser executado.

Novo projeto do ASP .NET Core Web Application

No projeto do Visual Studio criado vai ser adicionado código para ler o RSS do feed dos artigos da página de Internet da Revista PROGRAMAR. Primeiro é necessário criar o modelo de dados que vai ser utilizado para listar a informação como se pretende. Por defeito um feed é composto por um título, o endereço de internet, descrição e a data de publicação. Cria-se uma classe com o nome RSSFeedModel.cs ou outro se preferir no Models que vai contém o seguinte conteúdo:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
 
namespace revista_programar.Model 
{ 
    public class RSSFeedModel 
    { 
        public string ArticleTitle { get; set;} 
        public string ArticleLink { get; set;} 
        public string ArticleDescription { get; set;} 
        public string ArticleDate { get; set;} 
    } 
}

Com o modelo criado é necessário criar o Controler, o projeto já tem uma View inicial com à identificação HomeController.cs pode utilizar-se e adicionar o código que vai ler o XML com os artigos e armazenar uma lista do modelo criado.

public List<RSSFeedModel> GetFeed() 
{ 
    return Feed().Result; 
} 
 
[HttpPost] 
public async Task<List<RSSFeedModel>> Feed() 
{ 
    var articles = new List<RSSFeedModel>(); 
    string rssFeedURL = "https://www.revista-programar.info/feed/"; 
    HttpClient httpClient = new HttpClient(); 
    var httpContent = await httpClient.GetStringAsync(rssFeedURL); 
    XDocument xml = XDocument.Parse(httpContent); 
    var RSSFeedData = (from x in xml.Descendants("item") 
    select new RSSFeedModel 
    { 
       ArticleTitle = ((string)x.Element("title")), 
       ArticleLink = ((string)x.Element("link")), 
       ArticleDescription = ((string)x.Element("description")), 
       ArticleDate = ((string)x.Element("pubDate")) 
     }); 
     articles = RSSFeedData.ToList(); 
   return articles; 
}

Em IActionResult Index() adiciona-se o seguinte:

public IActionResult Index() 
{ 
   ViewBag.RSSFeed = GetFeed(); 
   return View(); 
}

Na View principal com a identificação Index.cshtml que é a página inicial pode personalizar à sua maneira para ler o RSS chama-se o ViewBag.RSSFeed do que contém a lista do Controller e transforma-se a lista numa tabela:

<div class="row"> 
    <table class="table table-hover"> 
        <thead> 
            <tr> 
                <th>Título</th> 
                <th>Link</th> 
                <th>Descrição</th> 
                <th>Data</th> 
            </tr> 
        </thead> 
        <tbody> 
            @if (ViewBag.RSSFeed != null) 
            { 
                foreach (var item in ViewBag.RSSFeed) 
                { 
                    <tr> 
                        <td>@item.ArticleTitle</td> 
                        <td><a href="@item.ArticleLink">@item.ArticleLink</a></td> 
                        <td>@item.ArticleDescription</td> 
                        <td>@item.ArticleDate</td> 
                    </tr> 
                } 
            } 
            else 
            { 
                <tr> 
                    <td>Sem informação</td> 
                    <td>Sem informação</td> 
                    <td>Sem informação</td> 
                    <td>Sem informação</td> 
                </tr> 
            } 
        </tbody> 
    </table> 
</div>

E o projeto está concluído. Mas antes de criar o Docker container para ser enviado para o Docker HUB eu recomendo testar primeiro na própria máquina. Para testar apenas é necessário executar a compilação do projeto e ter o Docker em execução.

Publicado na edição 58 (PDF) da Revista PROGRAMAR.