Generujeme RSS pomocí Repeateru v ASP.NET

25. září 2003

Pomocí ASP.NET můžeme pro naše partnery, ale i třeba zpravodajské weby nebo spřátelené weblogy zveřejnit náš obsah v podobě RSS nejen velmi snadno, ale oceníme i výhodu cachování na straně serveru. Začátečníci se zde seznámí s použitím snímače dat (DataReaderu), vykázáním dat pomocí ovládacího prvku Repeater, předání výsledku ASP.NET stránky ve formátu XML, načtení konfiguračních parametru a použijeme také cachování.

Ohledně RSS máme na Intervalu již několik článků. Odkazuji čtenáře proto na článek o tom co je RSS, kde je popsána struktura a vzorový příklad. Potřebnou službou je umět RSS také přečíst.

Předpokládejme, že máme v databázi tabulku (zde nazvaná articles) a v ní sloupce údajů o článku – id, date (datum vydání), author (autor článku), title (titulek článku), description (popisek, anotace článku). Pro vykázání dat formátovaných podle definice RSS 2.0 použijeme ve stránce ovládací prvek Repeater, pro „obálku“ RSS výstupu nastavíme vlastní záhlaví (HeaderTemplate) a zápatí (FooterTemplate) iterovaných položek (ItemTemplate).

<asp:Repeater id=“rptRss“ runat=“server“>
  <HeaderTemplate>
    <rss version=“2.0″>
      <channel>
        <title><%# ConfigurationSettings.AppSettings[„title“] %></title>
        <link><%# ConfigurationSettings.AppSettings[„homeURL“] %></link>
        <description><%# ConfigurationSettings.AppSettings[„description“] %></description>
  </HeaderTemplate>
  <ItemTemplate>
        <item>
          <title><%# FormatForXML(DataBinder.Eval(Container.DataItem,“title“)) %></title>
          <description>
            <%# FormatForXML(DataBinder.Eval(Container.DataItem, „description“)) %>
          </description>
          <link><%# ConfigurationSettings.AppSettings[„linkURL“] + DataBinder.Eval(Container.DataItem,“id“) %>
          <author><%# FormatForXML(DataBinder.Eval(Container.DataItem,“author“)) %></author>
          <pubDate><%# String.Format(„{0:R}“, DataBinder.Eval(Container.DataItem, „date“)) %>&lt/pubDate>
        </item>
  </ItemTemplate>
  <FooterTemplate>
      </channel>
    </rss>
  </FooterTemplate>
</asp:Repeater>

Abychom mohli Repater programově naplnit, určili jsme jeho id – v našem případě rptRss. V Repeateru definované šablony nám pak zajistí výstup korektního formátu RSS. Navazujeme (bindujeme) zde jak data z tabulky databáze (viz dále), tak i konfigurační hodnoty ze souboru Web.config. Díky jim můžeme snadno, bez zásahu do již hotové aplikace, určit, jak má vypadat odkaz vedoucí na náš článek – hlavní část URL zde získáme z Web.configu a z databáze doplňujeme pouze id článku. Obdobně je z konfiguračního souboru doplňován hlavní titulek, popisek a URL domácí stránky.

Dále se podíváme na direktivy stránky a výkonnou část script:

<%@ Page Language=“C#“ ContentType=“text/xml“ EnableViewState=“False“ EnableSessionState=“False“%>
<%@ OutputCache Duration=“7200″ VaryByParam=“none“ %>
<%@ Import Namespace=“System.Data“ %>
<%@ Import Namespace=“System.Data.SqlClient“ %>
<script language=“C#“ runat=“server“>
void Page_Load(object sender, System.EventArgs e)
{
  SqlConnection connection = new SqlConnection();
  connection.ConnectionString = ConfigurationSettings.AppSettings[„connectionString“];
  try
  {
    SqlCommand fillCmd = new SqlCommand („SELECT TOP 10 id,date,author,title,description FROM dbo.articles ORDER BY date DESC“,connection);
    connection.Open();
    rptRss.DataSource = fillCmd.ExecuteReader();
    fillCmd.Dispose();
    rptRss.DataBind();
  }
  finally
  {
    connection.Close();
  }
  connection.Dispose();
}
string FormatForXML(object objData)
{
  string strData = objData.ToString();
  strData = strData.Replace(„&“, „&amp;“);
  strData = strData.Replace(„\““, „&quot;“);
  strData = strData.Replace(„‚“, „&apos;“);
  strData = strData.Replace(„<„, „&lt;“);
  strData = strData.Replace(„>“, „&gt;“);
  return strData;
}
</script>

V direktivách stránky (Page) vidíme „povypínané“ funkce pro udržování stavových informací a zejména nastavení typu generovaného obsahu – zde text/xml. Nastavení typu obsahu je velmi důležité, pokud bychom jej vynechali, .net Framework použije výchozí text/html a výsledný RSS by nebyl korektní (v některých prohlížečích by se vůbec nezobrazil). Dále vidíme nastavení cachování (zde je obsah v paměti serveru podržen 2 hodiny, aniž by bylo třeba sahat do databáze).

V obsluze události Page_Load, která nastane při zavádění stránky na serveru, si připravíme připojovací řetězec (musí být zadán v souboru Web.config) pro připojení (SqlConnection) k naší databázi s tabulkou článků. V sekvenci try-finally se pokusíme o vytvoření SqlCommandu (jeden z jeho parametrů je řetězec SQL dotazu, kde vidíme vybrání deseti nejaktuálnějších článků pomocí klauzulí „TOP 10“ a „ORDER BY date DESC“). Následuje otevření spojení metodou Open(). Dále jako DataSource našeho Repeateru nastavíme výsledek metody ExecuteReader(), čímž se nám data z takzvaného snímače dat přenesou do ovládacího prvku. Aby došlo k navázání dat (aktuálního stavu datového zdroje – DataSource) podle šablony ovládacího prvku, je nutné ještě na něm provést metodu DataBind(). Použití snímače dat (DataReaderu) je zde velmi vhodné oproti jiným metodám získání dat z databáze, protože zde s daty nijak pracovat nepotřebujeme, opravdu nám postačí laicky řečeno „data rychle slíznout a odplesknout do ovládacího prvku“. Pro pořádek po sobě uklidíme metodami Close() a Dispose().

Všimněte si ještě metody FormatForXML(), kterou používáme v šablonách Repeateru. Je to proto, že předpokládáme, že texty článků mohou obsahovat některé znaky, které je v XML nutno zadávat entitami, jinak by soubor nebyl validní. Pomocí této metody dojde ke konverzi za běhu, přímo při „bindování“ dat na ovládací prvek.

Na závěr ještě ukázka konfiguračního souboru Web.config:

<?xml version=“1.0″ encoding=“utf-8″ ?>
<configuration>
  <system.web> 
    <globalization requestEncoding=“utf-8″ responseEncoding=“utf-8″ />
  </system.web>
  <appSettings>
    <add key=“title“ value=“Firma XY“ />
    <add key=“description“ value=“Novinky – co je nového u firmy XY?“ />
    <add key=“linkURL“ value=“http://server.cz/cms/Default.aspx?Id=“ />
    <add key=“homeURL“ value=“http://server.cz/cms/“ />
    <add key=“connectionString“ value=“Data Source=server;User ID=userid;Password=mypassword;Initial Catalog=mytable;“ />
  </appSettings>
</configuration>

Pro praktické použití je třeba si pochopitelně upravit nejen hodnoty v souboru Web.config, ale také SQL dotaz, aby odpovídal naší struktuře tabulky a případně také šablonu Repeateru, v případě, že chceme generovat více údajů, nebo některé naopak vynechat. Hodnotu 7200 použitou pro ukázku cachování je také dobré zvážit – čím vyšší, tím více šetříme přístupy do databáze, ale tím zastaralejší RSS také nabízíme. Vhodná hodnota tedy závisí na tom, jak často vydáváme nové články. (Můžete si stáhnout ukázkové soubory.)

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek synopsypromotion.com
Další článek SMARTY - syntaxe šablon
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Morico

    Srp 29, 2009 v 19:50

    Super, přesně tohle jsem hledal ! Díky moc

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *