您的位置:首页 > 编程语言 > ASP

在asp.net中使用异步同步rss

2006-10-09 14:37 369 查看
有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。

要求:论坛需要提供RSS支持。

代码如下:



1 task classtask class#region task class


2 //这是一个任务类,执行具体的任务


3 public class RssAsyncTask




4 ...{


5 private String _rssContent;


6 private AsyncTaskDelegate _dlgt;


7 private string rssUrl;


8 private bool _success;


9


10 public bool IsSuccess




11 ...{


12 get




13 ...{


14 return _success;


15 }


16 }


17


18 public RssAsyncTask(string rssUrl)




19 ...{


20 this.rssUrl = rssUrl;


21 }


22


23 // Create delegate.


24 protected delegate void AsyncTaskDelegate();


25


26 public String GetRssContent()




27 ...{


28 return _rssContent;


29 }


30 public void DoTheAsyncTask()




31 ...{


32 // Introduce an artificial delay to simulate a delayed


33 // asynchronous task. Make this greater than the


34 // AsyncTimeout property.


35 WebClient wc = new WebClient();


36 try




37 ...{


38 _rssContent = wc.DownloadString(rssUrl);


39 _success = true;


40 }


41 catch (Exception e)




42 ...{


43 _rssContent = e.Message;


44 }


45 finally




46 ...{


47 wc.Dispose();


48 }


49 //Thread.Sleep(TimeSpan.FromSeconds(5.0));


50 }


51


52 // Define the method that will get called to


53 // start the asynchronous task.


54 public IAsyncResult OnBegin(object sender, EventArgs e,


55 AsyncCallback cb, object extraData)




56 ...{


57 //_rssContent = "Beginning async task.";


58


59 _dlgt = new AsyncTaskDelegate(DoTheAsyncTask);


60 IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);


61


62 return result;


63 }


64


65 // Define the method that will get called when


66 // the asynchronous task is ended.


67 public void OnEnd(IAsyncResult ar)




68 ...{


69 //_rssContent = "Asynchronous task completed.";


70 _dlgt.EndInvoke(ar);


71 }


72


73 // Define the method that will get called if the task


74 // is not completed within the asynchronous timeout interval.


75 public void OnTimeout(IAsyncResult ar)




76 ...{


77 _rssContent = "Ansynchronous task failed to complete " +


78 "because it exceeded the AsyncTimeout parameter.";


79 }


80 }


81 #endregion


82


83 //一个自定义的控件,继承自另一个自定义控件。


84 public class RArticle


85 : LPanel




86 ...{




87 propertiesproperties#region properties


88 string rssUrl;


89


90 public string RssUrl




91 ...{




92 get ...{ return rssUrl; }




93 set ...{ rssUrl = value; }


94 }


95


96 int maxRecordNumber = 6;


97


98 public int MaxRecordNumber




99 ...{




100 get ...{ return maxRecordNumber; }




101 set ...{ maxRecordNumber = value; }


102 }


103 #endregion


104


105 RssAsyncTask task;


106 protected override void OnInit(EventArgs e)




107 ...{


108 base.OnInit(e);


109 task = new RssAsyncTask(this.rssUrl);


110 PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null);


111


112 Page.RegisterAsyncTask(asyncTask);


113 Page.ExecuteRegisteredAsyncTasks();


114 }


115


116 static Random r = new Random();


117 protected override void Render(System.Web.UI.HtmlTextWriter writer)




118 ...{


119 string rssContent = task.GetRssContent();


120 XmlDocument doc = null;


121 if (task.IsSuccess)




122 ...{


123 doc = new XmlDocument();


124 doc.LoadXml(rssContent);


125


126 this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;


127 this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;


128 this.ShowTitle = true;


129 }


130 base.RenderBegin(writer);


131


132 writer.WriteBeginTag("div");


133 writer.WriteAttribute("class", "child2");


134 Right(writer);


135 writer.WriteBeginTag("ul");


136 Right(writer);


137


138 if (doc != null)




139 ...{




140 successsuccess#region success


141


142 XmlNodeList items = doc.SelectNodes("rss/channel/item");


143 List<XmlNode> nodes = new List<XmlNode>();


144 foreach (XmlNode node in items)


145 nodes.Add(node);


146


147 //使用范型进行日期的倒序排列


148 nodes.Sort(new Comparison<XmlNode>(delegate(XmlNode n1, XmlNode n2)




149 ...{


150 DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);


151 DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);


152 TimeSpan ts = d2 - d1;


153 return (int)ts.TotalSeconds;


154 }));


155


156 for (int i = 0; i < maxRecordNumber; i++)




157 ...{


158 XmlNode node = nodes[i];


159 writer.WriteBeginTag("li");


160 Right(writer);


161 writer.WriteBeginTag("a");


162 writer.WriteAttribute("target", "_blank");


163 writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);


164 Right(writer);


165 writer.Write(node.SelectSingleNode("title").InnerText);


166 writer.WriteEndTag("a");


167 writer.WriteEndTag("li");


168 }


169


170 #endregion


171 }


172 else




173 ...{


174 writer.WriteBeginTag("pre");


175 Right(writer);


176 writer.Write(task.GetRssContent());


177 writer.WriteEndTag("pre");


178 }


179


180 writer.WriteEndTag("ul");


181 writer.WriteEndTag("div");


182


183 RenderChildren(writer);


184


185 base.RenderEnd(writer);


186 }


187 }


188



使用方法:
一、注册控件

CODE:

<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
二、调用

CODE:

<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl="http://bbs.5inet.net/rss.aspx" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: