前段時(shí)間作了個(gè)博客推廣方面的網(wǎng)站:中文博客群(http://www.bokequn.cn),里邊有個(gè)功能就是可以定時(shí)讀取博客們的文章信息到數(shù)據(jù)庫中,再顯示出來供用戶查詢和處理TAG.因?yàn)槭翘摂M主機(jī),所以只想到了用服務(wù)器端的timer來解決。
當(dāng)時(shí)比較匆忙沒來得及優(yōu)化,水平也很有限,如果大家覺得某些地方不對或者有更好的方式來解決,還請不吝賜教。
我覺得整個(gè)過程兩個(gè)重點(diǎn):
如何處理timer
將讀取rss模塊化,更方便調(diào)用
1.關(guān)于timer,當(dāng)然是寫在了Global.asax中,首先建立變量:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time"]));
其中在web.config 中用do_time來存取多久執(zhí)行一次
接下來在application_Start中處理:
t.AutoReset=true;
t.Enabled=true;
if(common.func.get_key("can_do")=="1")//也是在web.config中存取是否進(jìn)行定時(shí)處理,其中common.func.get_key是自定義的獲取設(shè)置的函數(shù)
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
函數(shù)fun的代碼:
PRivate void fun(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("開始讀取遠(yuǎn)程xml");//寫入日志
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML文件導(dǎo)入到數(shù)據(jù)庫成功"+Convert.ToString(dt2-dt));//將本次執(zhí)行時(shí)間寫入日志,
}
catch(Exception ex)
{
common.func.write_log("讀取遠(yuǎn)程xml文件出現(xiàn)錯(cuò)誤:"+ex.Message);//寫入日志
}
}
Global.asax中代碼完畢
2.接下來就是在rss2sql類中從數(shù)據(jù)庫獲取rss列表,根據(jù)上次讀取rss時(shí)間和rss文件的修改時(shí)間來讀取rss文件并寫到數(shù)據(jù)庫中,因?yàn)橛玫搅颂嘧远x的類和方法,所以不列出所有的代碼,有興趣的朋友可以到最后下載,其中比較重要的函數(shù):
/**//// <summary>
/// 讀取指定鏈接的rss內(nèi)容到數(shù)據(jù)庫
/// </summary>
/// <param name="id">對應(yīng)博客的id</param>
/// <param name="url">rss地址</param>
/// <param name="dt">上次讀取時(shí)間</param>
public void read_from_url(string id,string url,System.DateTime dt)
{
op_db.db_class db1=new op_db.db_class();
try
{
rssFeed feed = new rssFeed(url,dt);//建立一個(gè)rss讀取類實(shí)例
feed.read();//開始讀取
if(feed.Channel.Items.Count>0)//如果文章數(shù)大于0,開始讀取到數(shù)據(jù)庫
{
for(int i=0;i<feed.Channel.Items.Count;i++)
{
write_artical(id,feed.Channel.Items[i].title,feed.Channel.Items[i].link,feed.Channel.Items[i].descr}
finally
{
db1.db_close();
}
}
其中rssFeed 就是自己寫的處理rss的類,對于這個(gè)類,以前曾經(jīng)用過一段時(shí)間開源的rss.net,但是實(shí)際過程中因?yàn)楦鞣Nrss地址都有,甚至很多不太符合標(biāo)準(zhǔn),所以會遇到很多問題,而且看了一下源代碼,他想處理的東西太多了,代碼量也非常龐大,我這點(diǎn)水平估計(jì)一時(shí)半會是改不好的,于是就自己作了個(gè)控件,也算不上控件了,就幾個(gè)類,當(dāng)然我處理的內(nèi)容也相對簡單了很多,只處理rss的標(biāo)題和簡介,item的標(biāo)題,簡介,時(shí)間,鏈接。
代碼貼過來太多了,有興趣的朋友可以到最后下載
用法相當(dāng)簡單了,把編譯后的dll引用過來就可以如下使用:
rssFeed feed = new rssFeed(url,dt);//建立一個(gè)rss讀取類實(shí)例
feed.read();//開始讀取
feed.Channel.title
feed.Channel.description
feed.Channel.Items.Count
feed.Channel.Items[i].title
feed.Channel.Items[i].description
feed.Channel.Items[i].link
feed.Channel.Items[i].pubDate
構(gòu)造函數(shù)中的dt表示上次讀取時(shí)間,因?yàn)樵陬愔袝@得rss文件的修改時(shí)間,如果大于上次讀取時(shí)間才去讀取,否則就不處理了,別的相信大家一看就能明白了
目前rss讀取還存在著一個(gè)問題,就是有的xml文件中如果有16進(jìn)制字符(當(dāng)然這個(gè)出現(xiàn)的可能性不大)就讀取不了,哪位仁兄知道怎么解決,還請告知。
說的有些亂,還是希望對需要此功能的朋友有所幫助。
相關(guān)下載:http://www.survivalescaperooms.com/Files/guanvee/code.rar
http://guanvee.VEVb.com/archive/2006/06/17/428329.html
新聞熱點(diǎn)
疑難解答
圖片精選