Vor einiger Zeit habe ich eine Website zur Blog-Werbung erstellt: Chinese Blog Group ( http://www.bokequn.cn ). Darin gibt es eine Funktion, die die Blog-Artikelinformationen regelmäßig in die Datenbank einlesen und sie dann den Benutzern anzeigen kann Da es sich um einen virtuellen Host handelt, dachte ich nur daran, den serverseitigen Timer zu verwenden, um das Problem zu lösen.
Zu diesem Zeitpunkt hatte ich es eilig und hatte keine Zeit zum Optimieren, und mein Niveau war sehr begrenzt. Wenn Sie denken, dass etwas nicht stimmt oder es einen besseren Weg gibt, es zu lösen, können Sie mich gerne aufklären.
Ich denke, dass es im gesamten Prozess zwei wichtige Punkte gibt:
Wie man mit dem Timer umgeht
Modularisieren Sie das Lesen von RSS, um den Aufruf zu erleichtern
1. Was den Timer betrifft, wird er natürlich in Global.asax geschrieben. Erstellen Sie zunächst die Variable:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time " ]));
Unter anderem wird do_time in web.config verwendet, um darauf zuzugreifen, wie oft es ausgeführt wird,
und dann in Application_Start verarbeitet:
t.AutoReset=true;
t.Enabled=true;
if(common.func.get_key("can_do")=="1")//Es wird auch in web.config darauf zugegriffen, ob eine reguläre Verarbeitung durchgeführt werden soll, wobei common.func.get_key eine benutzerdefinierte Funktion zum Abrufen von Einstellungen ist
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
Funktionscode Spaß:
private void fun(object sender, System.Timers.ElapsedEventArgs e)
{
versuchen
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("Remote-XML lesen starten");//Protokoll schreiben
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML-Datei erfolgreich in Datenbank importiert"+Convert.ToString(dt2-dt));//Diese Ausführungszeit in das Protokoll schreiben,
}
Catch (Ausnahme ex)
{
common.func.write_log("Fehler beim Lesen der Remote-XML-Datei:"+ex.Message);//Protokoll schreiben
}
}
Der Code in Global.asax ist fertig
2. Der nächste Schritt besteht darin, die RSS-Liste aus der Datenbank in der Klasse rss2sql abzurufen, die RSS-Datei basierend auf der letzten gelesenen RSS-Zeit und der Änderungszeit der RSS-Datei zu lesen und in sie zu schreiben die Datenbank, da zu viele benutzerdefinierte Klassen und Methoden verwendet werden, sodass interessierte Freunde sie am Ende herunterladen können:
/**//// <Zusammenfassung>
/// Den RSS-Inhalt des angegebenen Links zur Datenbank lesen
/// </summary>
/// <param name="id">Die ID des entsprechenden Blogs</param>
/// <param name="url">RSS-Adresse</param>
/// <param name="dt">Letzte Lesezeit</param>
public void read_from_url(string id,string url,System.DateTime dt)
{
op_db.db_class db1=new op_db.db_class();
versuchen
{
rssFeed feed = new rssFeed(url,dt);//Eine RSS-Leseklasseninstanz erstellen
feed.read();//Mit dem Lesen beginnen
if(feed.Channel.Items.Count>0)//Wenn die Anzahl der Artikel größer als 0 ist, beginnen Sie mit dem Einlesen in die Datenbank
{
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 (Ausnahme ex)
{
common.func.write_log(id+":url:"+url+"Error"+ex.Message+ex.Source+ex.StackTrace);
}
Endlich
{
db1.db_close(
}
}
Darunter ist rssFeed eine von mir selbst geschriebene Klasse zur Verarbeitung von RSS. Für diese Klasse habe ich schon seit einiger Zeit die Open-Source-Adresse rss.net verwendet. Im eigentlichen Prozess gibt es jedoch verschiedene RSS-Adressen, und zwar viele Da einige davon nicht den Standards entsprechen, werden Sie auf viele Probleme stoßen. Nachdem ich mir den Quellcode angesehen hatte, gab es zu viele Dinge, mit denen er sich befassen wollte, und die Menge an Code war bei mir auch sehr groß Ich schätzte, dass es in einer Weile nicht möglich sein würde, es zu korrigieren, also habe ich selbst eine Kontrolle vorgenommen, was keine große Sache ist. Natürlich sind die Inhalte, mit denen ich mich beschäftige, relativ einfach Ich beschäftige mich nur mit dem Titel und der Einleitung von RSS, dem Titel, der Einleitung, der Zeit und dem Link des Artikels.
Es sind zu viele Codes gepostet. Freunde, die interessiert sind, können es am Ende herunterladen.
Die Verwendung ist ganz einfach:
rssFeed-Feed = new rssFeed(url,dt);//Create an Instanz der RSS-Leseklasse
feed.read();//Mit dem Lesen beginnen
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
Der dt im
Konstruktor„feed.Channel.Items[i].pubDate“
stellt die letzte Lesezeit dar, da die Änderungszeit der RSS-Datei in der Klasse abgerufen wird. Wenn sie größer als die letzte Lesezeit ist, wird sie gelesen , sonst wird es nicht verarbeitet.Ich glaube,
es gibt immer noch ein Problem beim Lesen von RSS. Das heißt, wenn es in einigen XML-Dateien hexadezimale Zeichen gibt kann nicht gelesen werden. Wenn jemand weiß, wie man es löst, lassen Sie es mich bitte wissen.
Es ist etwas verwirrend, aber ich hoffe, dass es Freunden, die diese Funktion benötigen, hilfreich sein wird.
Verwandte Downloads: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html