前段時間作了個博客推廣方面的網站:中文博客群( http://www.bokequn.cn ),裡邊有個功能就是可以定時讀取博客們的文章信息到數據庫中,再顯示出來供用戶查詢和處理TAG.因為是虛擬主機,所以只想到了用伺服器端的timer來解決。
當時比較匆忙來不及優化,水平也很有限,如果大家覺得某些地方不對或有更好的方式來解決,還請不吝賜教。
我覺得整個過程兩個重點:
如何處理timer
將讀取rss模組化,更方便調用
1.關於timer,當然寫在了Global.asax中,先建立變數:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time" ]));
其中在web.config 中用do_time來存取多久執行一次
接下來在Application_Start中處理:
t.AutoReset=true;
t.Enabled=true;
if(common.func.get_key("can_do")=="1")//也是在web.config中存取是否進行定時處理,其中common.func.get_key是自訂的取得設定的函數
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
函數fun的程式碼:
private void fun(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("開始讀取遠端XML");//寫入日誌
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML檔案匯入到資料庫成功"+Convert.ToString(dt2-dt));//將本執行時間寫入日誌,
}
catch(Exception ex)
{
common.func.write_log("讀取遠端xml檔案出現錯誤:"+ex.Message);//寫入日誌
}
}
Global.asax中代碼完畢
2.接下來就是在rss2sql類中從資料庫取得rss列表,根據上次讀取rss時間和rss檔的修改時間來讀取rss檔並寫到資料庫中,因為用到了太多自訂的類別和方法,所以不列出所有的程式碼,有興趣的朋友可以到最後下載,其中比較重要的函數:
/**//// <summary>
/// 讀取指定連結的rss內容到資料庫
/// </summary>
/// <param name="id">對應部落格的id</param>
/// <param name="url">rss位址</param>
/// <param name="dt">上次讀取時間</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);//建立一個rss讀取類別實例
feed.read();//開始讀取
if(feed.Channel.Items.Count>0)//如果文章數大於0,開始讀取到資料庫
{
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].description,feed.Channel.Items[i].pubDate);
}
db1.sql="update bokequn set last_rss_date='"+feed.lastModified.ToString()+"' where id="+id;
db1.executesql();
}
}
catch(Exception ex)
{
common.func.write_log(id+":url:"+url+"錯誤"+ex.Message+ex.Source+ex.StackTrace);
}
finally
{
db1.db_close();
}
}
其中rssFeed 就是自己寫的處理rss的類,對於這個類,以前曾經用過一段時間開源的rss.net,但是實際過程中因為各種rss地址都有,甚至很多不太符合標準,所以會遇到很多問題,而且看了一下原始程式碼,他想處理的東西太多了,程式碼量也非常龐大,我這點水平估計一時半會是改不好的,於是就自己作了個控件,也算不上控件了,就幾個類,當然我處理的內容也相對簡單了很多,只處理rss的標題和簡介,item的標題,簡介,時間,鏈接。
程式碼貼過來太多了,有興趣的朋友可以到最後下載
用法相當簡單了,把編譯後的dll引用過來就可以如下使用:
rssFeed feed = new rssFeed(url,dt);//建立一個rss讀取類別實例
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
建構函式中的dt表示上次讀取時間,因為在類別中會得到rss檔案的修改時間,如果大於上次讀取時間才去讀取,否則就不處理了,別的相信大家一看就能明白了
目前rss讀取還存在著一個問題,就是有的xml檔中如果有16進位字元(當然這個出現的可能性不大)就讀取不了,哪位仁兄知道怎麼解決,也請告知。
說的有些亂,還是希望對需要此功能的朋友有所幫助。
相關下載: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html