Il y a quelque temps, j'ai créé un site Web de promotion de blogs : Chinese Blog Group ( http://www.bokequn.cn ). Il contient une fonction qui permet de lire régulièrement les informations des articles de blog dans la base de données, puis de les afficher pour les utilisateurs. pour interroger. Et traiter TAG Parce qu'il s'agit d'un hôte virtuel, j'ai seulement pensé à utiliser la minuterie côté serveur pour le résoudre.
À ce moment-là, j'étais pressé et je n'avais pas le temps d'optimiser, et mon niveau était très limité. Si vous pensez que quelque chose ne va pas ou qu'il existe une meilleure façon de le résoudre, n'hésitez pas à m'éclairer.
Je pense qu'il y a deux points clés dans l'ensemble du processus :
comment gérer le minuteur
Modulariser la lecture RSS pour faciliter l'appel
1. Concernant le timer, bien sûr il est écrit en Global.asax. Créez d'abord la variable :
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time " ]));
Parmi eux, do_time est utilisé dans web.config pour accéder à la fréquence d'exécution,
puis traité dans Application_Start :
t.AutoReset=true ;
t.Enabled=true ;
if(common.func.get_key("can_do")=="1")//Il est également accessible dans web.config s'il faut effectuer un traitement régulier, où common.func.get_key est une fonction personnalisée pour obtenir les paramètres
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
Code de fonction amusant :
plaisir vide privé (expéditeur d'objet, System.Timers.ElapsedEventArgs e)
{
essayer
{
System.DateTime dt=System.DateTime.Now ;
common.func.write_log("Démarrer la lecture du XML distant");//Écrire le journal
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now ;
common.func.write_log("Fichier XML importé avec succès dans la base de données"+Convert.ToString(dt2-dt));//Écrire ce temps d'exécution dans le journal,
}
attraper(Exception ex)
{
common.func.write_log("Erreur lors de la lecture du fichier XML distant :"+ex.Message);//Écrire le journal
}
}
Le code dans Global.asax est terminé
2. L'étape suivante consiste à obtenir la liste rss de la base de données dans la classe rss2sql, à lire le fichier rss en fonction de l'heure de la dernière lecture rss et de l'heure de modification du fichier rss et à l'écrire dans la base de données, car trop de classes et de méthodes personnalisées sont utilisées, donc tous les codes ne sont pas répertoriés. Les amis intéressés peuvent les télécharger à la fin. Parmi elles, les fonctions les plus importantes :
/**//// <résumé>.
/// Lire le contenu RSS du lien spécifié vers la base de données
/// </summary>
/// <param name="id">L'identifiant du blog correspondant</param>
/// <param name="url">adresse rss</param>
/// <param name="dt">Heure de la dernière lecture</param>
public void read_from_url (identifiant de chaîne, URL de chaîne, System.DateTime dt)
{
op_db.db_class db1=nouveau op_db.db_class();
essayer
{
rssFeed feed = new rssFeed(url,dt);//Créer une instance de classe de lecture rss
feed.read();//Commencer la lecture
if(feed.Channel.Items.Count>0)//Si le nombre d'articles est supérieur à 0, commencez la lecture dans la base de données
{
pour(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()+"' où id="+id;
db1.executesql();
}
}
attraper(Exception ex)
{
common.func.write_log(id+":url:"+url+"Erreur"+ex.Message+ex.Source+ex.StackTrace);
}
enfin
{
db1.db_close();
}
}
Parmi eux, rssFeed est une classe écrite par moi-même pour traiter les flux RSS. Pour cette classe, j'ai utilisé l'open source rss.net pendant un certain temps auparavant. Cependant, dans le processus réel, il existe diverses adresses RSS, et même plusieurs. certains d'entre eux ne répondent pas aux normes, vous rencontrerez donc beaucoup de problèmes, et après avoir examiné le code source, il y avait trop de choses qu'il voulait traiter, et la quantité de code était également très importante. niveau, j'ai estimé qu'il ne serait pas possible de le corriger dans un moment, j'ai donc fait un contrôle moi-même, ce qui n'est pas grave. Les contrôles ne sont que quelques catégories. Bien sûr, le contenu que je traite est relativement simple. . Je m'occupe uniquement du titre et de l'introduction du RSS, du titre, de l'introduction, de l'heure et du lien de l'élément.
Il y a trop de codes postés. Les amis intéressés peuvent le télécharger à la fin.
L'utilisation est assez simple. Il suffit de référencer la dll compilée et de l'utiliser comme suit :
rssFeed feed = new rssFeed(url,dt);//Créer un. instance de classe de lecture rss
feed.read();//Commencer la lecture
flux.Channel.title
flux.Channel.description
flux.Channel.Items.Count
flux.Channel.Items[i].titre
flux.Channel.Items[i].description
flux.Channel.Items[i].link
Le dt dans le
constructeurfeed.Channel.Items[i].pubDate
représente l'heure de la dernière lecture, car l'heure de modification du fichier RSS sera obtenue dans la classe Si elle est supérieure à l'heure de la dernière lecture, il sera lu. , sinon il ne sera pas traité.D'accord, je pense que tout le monde peut comprendre en un coup d'œil.
Il y a toujours un problème dans la lecture RSS, c'est-à-dire que s'il y a des caractères hexadécimaux dans certains fichiers XML (bien sûr, c'est peu probable). ne peut pas être lu. Si quelqu'un sait comment le résoudre, faites-le-moi savoir.
C'est un peu déroutant, mais j'espère que cela sera utile aux amis qui ont besoin de cette fonction.
Téléchargements associés : http://guanvee.cnblogs.com/archive/2006/06/17/428329.html