I just wrote a technical article myself, please give me your advice. Ha ha.
Original original article: http://bbs.5inet.net/topic.aspx?topicid=181
Sometimes we need to read forum information on the web page. In traditional ASP, we use JS or IFRAME. These two None of these methods are very convenient and not friendly to search engines. Now with .Net we have another way.
Requirements: The forum needs to provide RSS support.
The code is as follows:
#region task class
//This is a task class that performs specific tasks
public class RssAsyncTask
{
private String _rssContent;
private AsyncTaskDelegate _dlgt;
private string rssUrl;
private bool _success;
public bool IsSuccess
{
get
{
return _success;
}
}
public RssAsyncTask(string rssUrl)
{
this.rssUrl = rssUrl;
}
// Create delegate.
protected delegate void AsyncTaskDelegate();
public String GetRssContent()
{
return _rssContent;
}
public void DoTheAsyncTask()
{
// Introduce an artificial delay to simulate a delayed
// asynchronous task. Make this greater than the
// AsyncTimeout property.
WebClient wc = new WebClient();
try
{
_rssContent = wc.DownloadString(rssUrl);
_success = true;
}
catch (Exception e)
{
_rssContent = e.Message;
}
finally
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Define the method that will get called to
// start the asynchronous task.
public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, object extraData)
{
//_rssContent = "Beginning async task.";
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
return result;
}
// Define the method that will get called when
// the asynchronous task is ended.
public void OnEnd(IAsyncResult ar)
{
//_rssContent = "Asynchronous task completed.";
_dlgt.EndInvoke(ar);
}
// Define the method that will get called if the task
// is not completed within the asynchronous timeout interval.
public void OnTimeout(IAsyncResult ar)
{
_rssContent = "Ansynchronous task failed to complete " +
"because it exceeded the AsyncTimeout parameter.";
}
}
#endregion
//A custom control inherits from another custom control.
public class RArticle
: LPanel
{
#region properties
string rssUrl;
public string RssUrl
{
get { return rssUrl; }
set { rssUrl = value; }
}
int maxRecordNumber = 6;
public int MaxRecordNumber
{
get { return maxRecordNumber; }
set { maxRecordNumber = value; }
}
#endregion
RssAsyncTask task;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
task = new RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null);
Page.RegisterAsyncTask(asyncTask);
Page.ExecuteRegisteredAsyncTasks();
}
static Random r = new Random();
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
string rssContent = task.GetRssContent();
XmlDocument doc = null;
if (task.IsSuccess)
{
doc = new XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = true;
}
base.RenderBegin(writer);
writer.WriteBeginTag("div");
writer.WriteAttribute("class", "child2");
Right(writer);
writer.WriteBeginTag("ul");
Right(writer);
if (doc != null)
{
#region success
XmlNodeList items = doc.SelectNodes("rss/channel/item");
List<XmlNode> nodes = new List<XmlNode>();
foreach (XmlNode node in items)
nodes.Add(node);
//Use generics to sort dates in reverse order
nodes.Sort(new Comparison<XmlNode>(delegate(XmlNode n1, XmlNode n2)
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
TimeSpan ts = d2 - d1;
return (int)ts.TotalSeconds;
}));
for (int i = 0; i < maxRecordNumber; i++)
{
XmlNode node = nodes[i];
writer.WriteBeginTag("li");
Right(writer);
writer.WriteBeginTag("a");
writer.WriteAttribute("target", "_blank");
writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Right(writer);
writer.Write(node.SelectSingleNode("title").InnerText);
writer.WriteEndTag("a");
writer.WriteEndTag("li");
}
#endregion
}
else
{
writer.WriteBeginTag("pre");
Right(writer);
writer.Write(task.GetRssContent());
writer.WriteEndTag("pre");
}
writer.WriteEndTag("ul");
writer.WriteEndTag("div");
RenderChildren(writer);
base.RenderEnd(writer);
}
}
How to use:
1. Registration control
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
2. Call
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
For the sake of simplicity, this program does not use technologies such as caching. If necessary, please add it yourself.