RSS Aggregator User Control
I think this is probably the last of the fun user controls that I created for my web sites, but this one was one of the more important ones for my https://www.nocommonground.com website. When I created NoCommonGround, I wanted a site that would take all the info that I wanted, and put it into one place. I figured the easiest way to do that, was to integrate all the RSS feeds into one simple place. Thus, I needed an RSS feed user control.
There are a few bugs with this, I don't do complete checking for nulls every where, but I do in some of the more important places. I also import my own schema, because I was having problems pulling the schema down from other websites sometimes, and things weren't working right.
Lets have a look at the code:
<%@ Control Language="C#" ClassName="BlogAgg" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
public string BlogRSSFeed = "";
public string BlogTitle = "";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (BlogRSSFeed == "")
this.Visible = false;
else
{
try
{
DataSet dsBlog = null;
dsBlog = (DataSet)Cache.Get(BlogRSSFeed);
if (dsBlog == null)
{
System.Net.WebProxy myProxy = new System.Net.WebProxy("https://MyProxy/", true);
dsBlog = new DataSet();
System.Net.WebRequest wr = System.Net.WebRequest.Create(BlogRSSFeed);
wr.Proxy = myProxy;
System.Net.WebResponse wresp = wr.GetResponse();
dsBlog.ReadXmlSchema(Server.MapPath("~") + "\\App_Data\\rss_schema.xsd");
dsBlog.ReadXml(wresp.GetResponseStream(), XmlReadMode.IgnoreSchema);
Cache.Add(BlogRSSFeed, dsBlog, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
hlTitleLink.Text = BlogTitle;
if (dsBlog.Tables["channel"].Rows[0]["link"] != System.DBNull.Value)
hlTitleLink.NavigateUrl = (string)dsBlog.Tables["channel"].Rows[0]["link"];
hlTitleLink.Text = BlogTitle;
hlTitle.Text = (string)dsBlog.Tables["item"].Rows[0]["title"];
hlTitle.NavigateUrl = (string)dsBlog.Tables["item"].Rows[0]["link"];
if (dsBlog.Tables["item"].Rows[0]["description"] != System.DBNull.Value)
lblEntry.Text = (string)dsBlog.Tables["item"].Rows[0]["description"];
else
lblEntry.Text = "";
int iRows = 10;
if (dsBlog.Tables["item"].Rows.Count < iRows)
iRows = dsBlog.Tables["item"].Rows.Count;
LiteralControl lcStart = new LiteralControl("<ul>");
pnlRecent.Controls.Add(lcStart);
for (int i = 1; i < iRows; i++)
{
LiteralControl lcOpen = new LiteralControl("<li>");
LiteralControl lcClose = new LiteralControl("</li>");
HyperLink hl = new HyperLink();
hl.Text = (string)dsBlog.Tables["item"].Rows[i]["Title"];
hl.NavigateUrl = (string)dsBlog.Tables["item"].Rows[i]["link"];
hl.Target = "_blank";
pnlRecent.Controls.Add(lcOpen);
pnlRecent.Controls.Add(hl);
pnlRecent.Controls.Add(lcClose);
}
LiteralControl lcStop = new LiteralControl("</ul>");
pnlRecent.Controls.Add(lcStop);
}
catch (Exception ex)
{
if ((Request.QueryString["debug"] != null) && (Request.QueryString["debug"].ToLower().Equals("true")))
{
lblEntry.Text = ex.ToString();
}
else
{
this.Visible = false;
}
}
}
}
}
</script>
And the HTML:
<h2 class="title">
<asp:HyperLink ID="hlTitleLink" runat="server"/></h2>
<div id="BorderDiv">
<table>
<tr>
<td style="vertical-align:top; text-align:justify;" width="60%">
<h2>
<asp:HyperLink ID="hlTitle" runat="server" Target="_blank" Text="No Recent Entries" />
</h2>
<asp:Label ID="lblEntry" style="text-align: justify;" runat="server" >
</asp:Label>
</td>
<td style="vertical-align:top;" width="40%">
<h2>
Previous Entries:</h2>
<asp:Panel ID="pnlRecent" runat="server" />
</td>
</tr>
</table>
</div>
Overall, it's pretty simple, you can see an example at https://www.nocommonground.com The photo user controls at the top are just a slight variation on this code, and do some special processing on the data that is handed back so it'll show the picture correctly.
Enjoy!
Comments
- Anonymous
September 26, 2005
sorry but not a real need for this since we have this http://www.scottonwriting.net/sowBlog/RssFeed.htm - Anonymous
September 26, 2005
Thanks for the link love, Simone. I do need to update RssFeed sooner than later to support Atom, though. But right now it works equally well with RSS and RDF. - Anonymous
September 28, 2005
Nice updates on the new 1.9 Scott.