在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" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。
相关文章推荐
- 在asp.net中使用异步同步rss
- 在asp.net中使用异步同步rss
- 在asp.net中使用异步同步rss
- 在asp.net中使用异步同步rss
- ASP.NET下AJAX.AJAXMETHOD使用方法,微软ajax 异步 同步的修改方法
- C#、Asp.net 使用 WebClient Get Post(同步、异步)
- ASP.NET MVC同步和异步的使用总结
- ASP.NET Core使用HttpClient的同步和异步请求
- ASP.NET WebAPi(selfhost)之文件同步或异步上传
- ASP.NET WebAPi(selfhost)实现文件同步或异步上传
- ASP.NET MVC异步上传图片和富文本编辑器的使用详解
- 使用ASP.NET MVC Futures 中的异步Action
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(1):调用Web Service、调用页面中的类方法(转)
- 黑马程序员_学习日记66_716ASP.NET(使用回调函数的异步委托、生产者消费者)
- asp.net使用jquery.form实现图片异步上传
- ASP.NET MVC中使用ASP.NET AJAX异步访问WebService
- ASP.NET MVC验证 - 使用哪种方式实现客户端服务端双重异步验证
- asp.net使用H5新特性实现异步上传
- ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中
- 在 ASP.NET MVC 中使用异步控制器