標籤:style blog http tar color get
asp.net 定時器 比較少用, 中國紅木網
這是一個相當實用的功能,有了RSS部落格鏡像,就不需要在多處同時發布部落格日誌了。比如你同時在新浪上有自己的部落格,又同時有自己的個人部落格網站,那麼你只需要在新浪上發布部落格日誌,而個人部落格網站通過RSS部落格鏡像功能將新浪部落格上發布的新日誌自動更新到網站中。
我們在ASP.NET的,至於asp,由於其天生的局限性,可能無法直接在Web應用程式中完成這一功能,而需要額外的Windows應用程式的支援。
1. 管理RSS部落格鏡像
首先我們需要在RSS部落格鏡像,需要管理的內容有:
l RSS地址
l 更新頻率
l 最後更新的時間
需要管理的內容,這裡所列出的3個是必須的欄位,當然根據你自己系統的需要,你可能需要更多的欄位。
這部分工作由於和RSS部落格鏡像,和你本身的系統也是比較相關的,這裡就不再多做介紹,你根據自己系統的需要去實現就行。
2. 通過ASP.NET的定時器來抓取RSS源
有了上面的對每個RSS種子ASP.NET中設定一個定時器來定時更新這些RSS種子內容了。
這部分內容請主要參考如下文章《在 ASP.NET 中使用計時器(Timer)》 部落格中的實現方式:,根據這篇文章實現定時器就足夠了。下面我主要介紹下在
這下面的代碼都在Global.ascx.cs中實現。
protected void Application_Start(Object sender, EventArgs e)
{
SetApplicationStatus(RssMirror, true);
// 設定定時器
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(this.RefressRssMirror);
timer.Interval = 300000; // 每5分鐘中觸發定時器
timer.AutoReset = true;
timer.Enabled = true;
}
private void SetApplicationStatus(string keyword, object result)
{
Application.Lock();
Application[keyword] = result;
Application.UnLock();
}
private void UpdateRssMirror(fmRssMirror item, fmblog.Data.DataProviders.DataProvider provider)
{
try
{
DateTime now = DateTime.Now;
XmlDocument doc = new XmlDocument();
// 載入RSS種子
doc.Load(item.FeedUrl);
// 解析RSS種子內容
fmPostCollection list = fmFeedParser.GetPosts(item.UserName, doc, item.LastUpdateTime);
for(int i=list.Count-1; i>=0; i--)
{
// 根據標題,判斷部落格日誌是否已經存在
if(provider.GetPost(item.UserName, list[i].Title)==null)
{
provider.NewPost(list[i], string.Empty);
}
}
// 設定最後更新時間
provider.SetRssMirrorLastUpdateTime(item.Id, now, item.UserName);
}
catch(Exception)
{
}
}
protected void RefressRssMirror(object sender, System.Timers.ElapsedEventArgs e)
{
// 判斷上次觸發的定時器是否已經完成
if((bool)Application[RssMirror])
{
SetApplicationStatus(RssMirror, false);
try
{
fmblog.Data.DataProviders.DataProvider provider = fmblog.Data.DataProviders.DataProvider.CreateInstance(Application);
provider.OpenConnection();
try
{
fmRssMirrorCollection list = provider.GetAllRssMirrors();
DateTime now = DateTime.Now;
// 更新RSS部落格鏡像裡的所有RSS種子
foreach(fmRssMirror item in list)
{
TimeSpan span = now - item.LastUpdateTime;
if(span.Hours>=item.UpdateInterval)
{
UpdateRssMirror(item, provider);
}
}
}
catch(Exception)
{
}
provider.CloseConnection();
}
catch(Exception)
{
}
SetApplicationStatus(RssMirror, true);
}
}