■有的时候我们需要在网页里读取论坛的信息,...... 有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。 要求:论坛需要提供RSS支持。 代码如下: #region task class //这是一个任务类,执行具体的任务 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 //一个自定义的控件,继承自另一个自定义控件。 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 foreach (XmlNode node in items) nodes.Add(node); //使用范型进行日期的倒序排列 nodes.Sort(new Comparison { 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); } } 使用方法: 一、注册控件 <%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %> 二、调用 为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 21:19 , Processed in 0.116502 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.