有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。
有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。
要求:论坛需要提供RSS支持。
代码如下:
1 task 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 properties#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 success#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
使用方法: 一、注册控件
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
二、调用
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl="http://bbs.5inet.net/rss.aspx" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。
原文首发:http://bbs.5inet.net/topic.aspx?topicid=181
具体效果请见本站首页: http://www.5inet.net/
本文首发无垠论坛,请大家多指教。
|