有的时候我们需要在网页里读取论坛的信息,在传统ASP的时候我们使用的是JS或者是IFRAME,这两种方式都不是很方便,而且对搜索引擎不友好。现在有了.Net,我们有了另一种方式。 要求:论坛需要提供RSS支持。 代码如下: |
1
task
class
taskclass
#regiontaskclass
2//这是一个任务类,执行具体的任务
3publicclassRssAsyncTask
4...{
5privateString_rssContent;
6privateAsyncTaskDelegate_dlgt;
7privatestringrssUrl;
8privatebool_success;
9
10publicboolIsSuccess
11...{
12get
13...{
14return_success;
15}
16}
17
18publicRssAsyncTask(stringrssUrl)
19...{
20this.rssUrl=rssUrl;
21}
22
23//Createdelegate.
24protecteddelegatevoidAsyncTaskDelegate();
25
26publicStringGetRssContent()
27...{
28return_rssContent;
29}
30publicvoidDoTheAsyncTask()
31...{
32//Introduceanartificialdelaytosimulateadelayed
33//asynchronoustask.Makethisgreaterthanthe
34//AsyncTimeoutproperty.
35WebClientwc=newWebClient();
36try
37...{
38_rssContent=wc.DownloadString(rssUrl);
39_success=true;
40}
41catch(Exceptione)
42...{
43_rssContent=e.Message;
44}
45finally
46...{
47wc.Dispose();
48}
49//Thread.Sleep(TimeSpan.FromSeconds(5.0));
50}
51
52//Definethemethodthatwillgetcalledto
53//starttheasynchronoustask.
54publicIAsyncResultOnBegin(objectsender,EventArgse,
55AsyncCallbackcb,objectextraData)
56...{
57//_rssContent="Beginningasynctask.";
58
59_dlgt=newAsyncTaskDelegate(DoTheAsyncTask);
60IAsyncResultresult=_dlgt.BeginInvoke(cb,extraData);
61
62returnresult;
63}
64
65//Definethemethodthatwillgetcalledwhen
66//theasynchronoustaskisended.
67publicvoidOnEnd(IAsyncResultar)
68...{
69//_rssContent="Asynchronoustaskcompleted.";
70_dlgt.EndInvoke(ar);
71}
72
73//Definethemethodthatwillgetcalledifthetask
74//isnotcompletedwithintheasynchronoustimeoutinterval.
75publicvoidOnTimeout(IAsyncResultar)
76...{
77_rssContent="Ansynchronoustaskfailedtocomplete"+
78"becauseitexceededtheAsyncTimeoutparameter.";
79}
80}
81#endregion
82
83 // 一个自定义的控件,继承自另一个自定义控件。
84 public class RArticle
85 :LPanel
86 ... {
87propertiesproperties#regionproperties
88stringrssUrl;
89
90publicstringRssUrl
91...{
92get...{returnrssUrl;}
93set...{rssUrl=value;}
94}
95
96intmaxRecordNumber=6;
97
98publicintMaxRecordNumber
99...{
100get...{returnmaxRecordNumber;}
101set...{maxRecordNumber=value;}
102}
103#endregion
104
105RssAsyncTasktask;
106protectedoverridevoidOnInit(EventArgse)
107...{
108base.OnInit(e);
109task=newRssAsyncTask(this.rssUrl);
110PageAsyncTaskasyncTask=newPageAsyncTask(task.OnBegin,task.OnEnd,task.OnTimeout,null);
111
112Page.RegisterAsyncTask(asyncTask);
113Page.ExecuteRegisteredAsyncTasks();
114}
115
116staticRandomr=newRandom();
117protectedoverridevoidRender(System.Web.UI.HtmlTextWriterwriter)
118...{
119stringrssContent=task.GetRssContent();
120XmlDocumentdoc=null;
121if(task.IsSuccess)
122...{
123doc=newXmlDocument();
124doc.LoadXml(rssContent);
125
126this.Title=doc.SelectSingleNode("rss/channel/title").InnerText;
127this.TitleNavigateUrl=doc.SelectSingleNode("rss/channel/link").InnerText;
128this.ShowTitle=true;
129}
130base.RenderBegin(writer);
131
132writer.WriteBeginTag("div");
133writer.WriteAttribute("class","child2");
134Right(writer);
135writer.WriteBeginTag("ul");
136Right(writer);
137
138if(doc!=null)
139...{
140successsuccess#regionsuccess
141
142XmlNodeListitems=doc.SelectNodes("rss/channel/item");
143List<XmlNode>nodes=newList<XmlNode>();
144foreach(XmlNodenodeinitems)
145nodes.Add(node);
146
147//使用范型进行日期的倒序排列
148nodes.Sort(newComparison<XmlNode>(delegate(XmlNoden1,XmlNoden2)
149...{
150DateTimed1=DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
151DateTimed2=DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
152TimeSpants=d2-d1;
153return(int)ts.TotalSeconds;
154}));
155
156for(inti=0;i<maxRecordNumber;i++)
157...{
158XmlNodenode=nodes[i];
159writer.WriteBeginTag("li");
160Right(writer);
161writer.WriteBeginTag("a");
162writer.WriteAttribute("target","_blank");
163writer.WriteAttribute("href",node.SelectSingleNode("link").InnerText);
164Right(writer);
165writer.Write(node.SelectSingleNode("title").InnerText);
166writer.WriteEndTag("a");
167writer.WriteEndTag("li");
168}
169
170#endregion
171}
172else
173...{
174writer.WriteBeginTag("pre");
175Right(writer);
176writer.Write(task.GetRssContent());
177writer.WriteEndTag("pre");
178}
179
180writer.WriteEndTag("ul");
181writer.WriteEndTag("div");
182
183RenderChildren(writer);
184
185base.RenderEnd(writer);
186}
187}
188
2//这是一个任务类,执行具体的任务
3publicclassRssAsyncTask
4...{
5privateString_rssContent;
6privateAsyncTaskDelegate_dlgt;
7privatestringrssUrl;
8privatebool_success;
9
10publicboolIsSuccess
11...{
12get
13...{
14return_success;
15}
16}
17
18publicRssAsyncTask(stringrssUrl)
19...{
20this.rssUrl=rssUrl;
21}
22
23//Createdelegate.
24protecteddelegatevoidAsyncTaskDelegate();
25
26publicStringGetRssContent()
27...{
28return_rssContent;
29}
30publicvoidDoTheAsyncTask()
31...{
32//Introduceanartificialdelaytosimulateadelayed
33//asynchronoustask.Makethisgreaterthanthe
34//AsyncTimeoutproperty.
35WebClientwc=newWebClient();
36try
37...{
38_rssContent=wc.DownloadString(rssUrl);
39_success=true;
40}
41catch(Exceptione)
42...{
43_rssContent=e.Message;
44}
45finally
46...{
47wc.Dispose();
48}
49//Thread.Sleep(TimeSpan.FromSeconds(5.0));
50}
51
52//Definethemethodthatwillgetcalledto
53//starttheasynchronoustask.
54publicIAsyncResultOnBegin(objectsender,EventArgse,
55AsyncCallbackcb,objectextraData)
56...{
57//_rssContent="Beginningasynctask.";
58
59_dlgt=newAsyncTaskDelegate(DoTheAsyncTask);
60IAsyncResultresult=_dlgt.BeginInvoke(cb,extraData);
61
62returnresult;
63}
64
65//Definethemethodthatwillgetcalledwhen
66//theasynchronoustaskisended.
67publicvoidOnEnd(IAsyncResultar)
68...{
69//_rssContent="Asynchronoustaskcompleted.";
70_dlgt.EndInvoke(ar);
71}
72
73//Definethemethodthatwillgetcalledifthetask
74//isnotcompletedwithintheasynchronoustimeoutinterval.
75publicvoidOnTimeout(IAsyncResultar)
76...{
77_rssContent="Ansynchronoustaskfailedtocomplete"+
78"becauseitexceededtheAsyncTimeoutparameter.";
79}
80}
81#endregion
82
83 // 一个自定义的控件,继承自另一个自定义控件。
84 public class RArticle
85 :LPanel
86 ... {
87propertiesproperties#regionproperties
88stringrssUrl;
89
90publicstringRssUrl
91...{
92get...{returnrssUrl;}
93set...{rssUrl=value;}
94}
95
96intmaxRecordNumber=6;
97
98publicintMaxRecordNumber
99...{
100get...{returnmaxRecordNumber;}
101set...{maxRecordNumber=value;}
102}
103#endregion
104
105RssAsyncTasktask;
106protectedoverridevoidOnInit(EventArgse)
107...{
108base.OnInit(e);
109task=newRssAsyncTask(this.rssUrl);
110PageAsyncTaskasyncTask=newPageAsyncTask(task.OnBegin,task.OnEnd,task.OnTimeout,null);
111
112Page.RegisterAsyncTask(asyncTask);
113Page.ExecuteRegisteredAsyncTasks();
114}
115
116staticRandomr=newRandom();
117protectedoverridevoidRender(System.Web.UI.HtmlTextWriterwriter)
118...{
119stringrssContent=task.GetRssContent();
120XmlDocumentdoc=null;
121if(task.IsSuccess)
122...{
123doc=newXmlDocument();
124doc.LoadXml(rssContent);
125
126this.Title=doc.SelectSingleNode("rss/channel/title").InnerText;
127this.TitleNavigateUrl=doc.SelectSingleNode("rss/channel/link").InnerText;
128this.ShowTitle=true;
129}
130base.RenderBegin(writer);
131
132writer.WriteBeginTag("div");
133writer.WriteAttribute("class","child2");
134Right(writer);
135writer.WriteBeginTag("ul");
136Right(writer);
137
138if(doc!=null)
139...{
140successsuccess#regionsuccess
141
142XmlNodeListitems=doc.SelectNodes("rss/channel/item");
143List<XmlNode>nodes=newList<XmlNode>();
144foreach(XmlNodenodeinitems)
145nodes.Add(node);
146
147//使用范型进行日期的倒序排列
148nodes.Sort(newComparison<XmlNode>(delegate(XmlNoden1,XmlNoden2)
149...{
150DateTimed1=DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
151DateTimed2=DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
152TimeSpants=d2-d1;
153return(int)ts.TotalSeconds;
154}));
155
156for(inti=0;i<maxRecordNumber;i++)
157...{
158XmlNodenode=nodes[i];
159writer.WriteBeginTag("li");
160Right(writer);
161writer.WriteBeginTag("a");
162writer.WriteAttribute("target","_blank");
163writer.WriteAttribute("href",node.SelectSingleNode("link").InnerText);
164Right(writer);
165writer.Write(node.SelectSingleNode("title").InnerText);
166writer.WriteEndTag("a");
167writer.WriteEndTag("li");
168}
169
170#endregion
171}
172else
173...{
174writer.WriteBeginTag("pre");
175Right(writer);
176writer.Write(task.GetRssContent());
177writer.WriteEndTag("pre");
178}
179
180writer.WriteEndTag("ul");
181writer.WriteEndTag("div");
182
183RenderChildren(writer);
184
185base.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" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。