`
jinvasshole
  • 浏览: 772345 次
文章分类
社区版块
存档分类
最新评论

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

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

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

代码如下:
1taskclasstaskclass#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//一个自定义的控件,继承自另一个自定义控件。
84publicclassRArticle
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" />
为了简便起见,本程序就没有使用缓存之类的技术了,如有必要,请自行添加。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics