程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 在虛擬主機中用ASP.NET1.1服務器端TIMER定時讀取RSS信息到數據庫

在虛擬主機中用ASP.NET1.1服務器端TIMER定時讀取RSS信息到數據庫

編輯:.NET實例教程

前段時間作了個博客推廣方面的網站:中文博客群(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://www.cnblogs.com/Files/guanvee/code.rar

http://guanvee.cnblogs.com/archive/2006/06/17/428329.Html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved