Desenvolvimento - ASP. NET

Consumindo RSS no ASP.NET

O RSS nada mais é do que um formato padronizado de XML utilizado para disponibilizar informações específicas na internet. Veja neste artigo como fazer seu consumo em uma página ASP.NET.

por Rodrigo Pires



O RSS nada mais é do que um formato padronizado de XML utilizado para disponibilizar informações específicas na internet.

Um RSS Feed é um documento XML disponibilizado e atualizado regularmente por algum site, oferecendo conteúdo dinâmico que pode ser consumido por aplicações cliente.

Este documento oferece metadados sobre uma fonte de conteúdo (notícias, artigos, eventos, posts em blogs etc). O site msdn.com é um bom exemplo, disponibilizando uma série de feeds para serem consumidos: http://msdn.microsoft.com/aboutmsdn/rss/.

Obs: experimente com o RSS do Linha de Código também.

Um RSS Feed (documento XML) é formado por um channel, que é a fonte do conteúdo, e contém um title e description, que descrevem a fonte do conteúdo. Além disso, contém um ou mais elementos item, representando cada item do conteúdo (cada notícia, por exemplo). Cada item, por sua vez, pode ter um title, link e description.

(Dica: Leia mais sobre o que é o RSS neste link: http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html)

Dessa forma, os RSS Feeds terão geralmente a seguinte estrutura:

 <rss version="2.0">
  <channel>
    <title>RSS Feeds - by Codificando.net</title>
    <link>http://www.codificando.net</link>
    <description>by Rodrigo Pires</description>
    <image>
      <url> http://www.codificando.net/images/Topo_01.jpg</url>
      <title>Codificando.NET</title>
      <link>http://www.codificando.net</link>
    </image>
    <item>          
      <title>Artigo sobre Consumação de RSS</title>
      <link>http://www.codificando.net</link>
      <description>Este artigo demonstra como consumir um RSS Feed (XML) através do 
ASP.NET.</description>
      <pubDate>Wed, 23 Mar 2005 16:38:55 GMT</pubDate>
    </item>
    <item>
      <title>Segundo artigo</title>
      <link>http://www.codificando.net</link>
      <description>Descrição do Segundo artigo.</description>
      <pubDate> Wed, 27 Mar 2005 14:32:22 GMT </pubDate>
    </item>
  </channel>   
 </rss>

Vamos agora colocar a mão na massa e criar uma aplicação ASP.NET que irá ler um RSS Feed disponibilizado na internet.

1) Criando o projeto

Crie um novo Projeto no VS.NET (File > New > Project). Escolha "Visual Basic Projects", template "ASP.NET Web Application" (figura 1). Informe um nome para o projeto (neste caso, utilizei Rss).


Figura 1: Criando o projeto no Visual Studio .Net.

2) Criando e configurando o DataGrid

Abra o webform gerado automaticamente (WebForm1.aspx). No modo Designer, abra a ToolBox (Ctrl+Alt+X) e arraste o objeto DataGrid. Nomeie o DataGrid como grd_aspnet. Defina a propriedade AutoGenerateColumns como False, e aplique o tipo de fonte que desejar.

Configure então as colunas do grid (clique com botão direito no grid > Property Builder).

No lado esquerdo da janela "Properties" do grid, clique na seção "Columns".

Na lista "Available Columns", selecione a "Hyperlink Column", e clique no botão para adicionar (">"), para que a coluna seja adiciona ao grid, aparecendo assim na lista "Selected columns", à direita. Configure então as seguintes propriedades da coluna:

Header text: Title (ou um título qualquer para a coluna)
Text field: title (esse é o nó xml que contém o título do artigo/notícia)
URL field: link (este é o nó xml que contém o link para o artigo/notícia)
Target: _blank (forçará o link a abrir em uma nova janela).

As configurações devem ficar como na figura 2:


Figura 2: Configurando as colunas do DataGrid. Neste caso, apenas uma coluna do tipo Hyperlink Column é adicionada ao grid. Aplique o estilo visual que desejar ao grid (clique com botão direito no grid > Auto Format). A página deve estar agora semelhante à figura 3:


Figura 3: Aparência da página.

3) Acessando o RSS

Terminada a montagem do layout, iremos agora codificar o acesso ao XML desejado (disponibilizado na internet) e carrega-lo em um DataSet, para assim podermos preencher o DataGrid.

No nosso exemplo, utilizaremos o RSS para listar artigos e "headlines" sobre ASP.NET, disponibilizado direto na fonte, pelo MSDN.com. O link para o RSS é http://msdn.microsoft.com/asp.net/rss.xml.

(Obs.: Obviamente você poderá utilizar qualquer RSS Feed disponibilizado na internet).

Ainda no arquivo WebForm1.aspx, vá para o código (F7).

Defina o seguinte código no método Page_Load:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Handles MyBase.Load
        If Not Page.IsPostBack Then
            Try
                "-- Carrega o XML diretamente no DataSet
                Dim ds as DataSet = New DataSet
                ds.ReadXml("http://msdn.microsoft.com/asp.net/rss.xml")
                Me.grd_aspnet.DataSource = ds.Tables(2).DefaultView
                Me.grd_aspnet.DataBind()
            Catch ex As Exception
                Response.Write("Erro: " & ex.Message)
            End Try
        End If
    End Sub

Note que o método ReadXml() do DataSet irá gerar um Schema com 3 DataTables (conforme a estrutura do XML): RSS, Channnel e Item. Como precisamos carregar a tabela Item, que é a que contém a listagem dos dados, é utilizado o índice 2 no range de Tabelas ao definir o DataSource do grid.

No Solution Explorer, clique com o botão direito no arquivo WebForm1.aspx e depois em "View in Browser". O resultado deverá ser como o da figura 4:


Figura 4: Conteúdo do XML (RSS Feed) sendo exibido no DataGrid, com link para abrir cada artigo.

Porém, na primeira vez em que fiz esse teste, obtive o seguinte erro:

Erro: The underlying connection was closed: Unable to connect to the remote server.

Este erro ocorre porque, no caso da máquina onde a aplicação rodava (minha máquina de desenvolvimento) o acesso à Internet é feito através de um servidor Proxy na rede. Veremos a seguir como contornar essa situação.

4) Acessando o RSS através do Proxy

Quando o acesso à internet na máquina onde a aplicação roda é feito através de um Proxy, devemos fazer uma pequena modificação em nosso código, criando um objeto WebRequest, juntamente com um objeto WebProxy (namespace System.Net), para que possamos definir as credenciais (usuário/senha/domínio) a serem utilizadas no Proxy para esse acesso.

Além disso, podem ocorrer problemas ao tentar criar o objeto WebProxy informando um usuário que tem restrições no Proxy (restrições de acesso a determinados sites, por exemplo):

Erro: (407) Proxy Authentication Required.

O ideal é tentar utilizar um usuário com o mínimo de restrições, ou até mesmo com privilégios de administrador.

Modifique o código para que fique da seguinte forma:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Handles MyBase.Load
        If Not Page.IsPostBack Then
            Try
                Dim sIpProxy As String
                sIpProxy = "http://ip_do_seu_proxy:porta"

                "-- Carrega o XML no DataSet, através de Stream
                Dim ds as DataSet = New DataSet
                ds.ReadXml(ObtemStreamParaURI("http://msdn.microsoft.com/asp.net/rss.xml", sIpProxy))
                Me.grd_aspnet.DataSource = ds.Tables(2).DefaultView
                Me.grd_aspnet.DataBind()
            Catch ex As Exception
                Response.Write("Erro: " & ex.Message)
            End Try
        End If
    End Sub

    Public Shared Function ObtemStreamParaURI(ByVal pa_uri As String, ByVal pa_proxyuri As String) As 
System.IO.Stream
        "-- Cria o objeto Request
        Dim oReq As System.Net.WebRequest
        oReq = System.Net.WebRequest.Create(pa_uri)
        "-- Cria o objeto Proxy
        Dim oProxy As New System.Net.WebProxy(pa_proxyuri, True) "passa pelo proxy
        "-- Cria as credenciais para utilizar no Proxy
        oProxy.Credentials = New System.Net.NetworkCredential("user", "password", "dominio")
        oReq.Proxy = oProxy
        "-- Retorna o Stream do Response
        Return oReq.GetResponse().GetResponseStream()
    End Function

Teste novamente a página. O resultado deve ser o grid listando os artigos fornecidos no XML (conforme mostrado na figura 4).

Espero que este artigo o ajude de alguma forma. Se tiver alguma dúvida, entre em contato! ;-)

Rodrigo Pires

Rodrigo Pires - Analista de sistemas, formado em Tecnologia em Desenvolvimento de Sistemas e cursando Pós-graduação em desenvolvimento de software para Web (UFSCAR).
Trabalha há 4 anos com desenvolvimento de aplicações para web, principalmente na plataforma .NET.