Hace algún tiempo, creé un sitio web de promoción de blogs: Chinese Blog Group ( http://www.bokequn.cn ). Tiene una función que puede leer periódicamente la información del artículo del blog en la base de datos y luego mostrarla a los usuarios. para consultar Y procesar TAG Debido a que es un host virtual, solo pensé en usar el temporizador del lado del servidor para resolverlo.
En ese momento, tenía prisa y no tenía tiempo para optimizar, y mi nivel era muy limitado. Si cree que algo anda mal o que hay una mejor manera de solucionarlo, no dude en informarme.
Creo que hay dos puntos clave en todo el proceso:
cómo lidiar con el temporizador
Modularice la lectura de RSS para que sea más fácil llamar
1. En cuanto al temporizador, por supuesto, está escrito en Global.asax. Primero cree la variable:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time). " ]));
Entre ellos, do_time se usa en web.config para acceder a la frecuencia de ejecución
y luego se procesa en Application_Start:
t.AutoReset=true;
t.Enabled=verdadero;
if(common.func.get_key("can_do")=="1")// También se accede en web.config para realizar el procesamiento regular, donde common.func.get_key es una función personalizada para obtener configuraciones
t.Elapsed +=new System.Timers.ElapsedEventHandler(diversión);
Código de función divertida:
diversión vacía privada (remitente del objeto, System.Timers.ElapsedEventArgs e)
{
intentar
{
System.DateTime dt=System.DateTime.Ahora;
common.func.write_log("Comenzar a leer XML remoto");//Escribir registro
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Ahora;
common.func.write_log("El archivo XML se importó correctamente a la base de datos"+Convert.ToString(dt2-dt));//Escribe este tiempo de ejecución en el registro,
}
captura (Excepción ex)
{
common.func.write_log("Error al leer el archivo xml remoto:"+ex.Message);//Escribir registro
}
}
El código en Global.asax está completo
2. El siguiente paso es obtener la lista rss de la base de datos en la clase rss2sql, leer el archivo rss según la hora de la última lectura rss y la hora de modificación del archivo rss y escribirlo en la base de datos, porque se utilizan demasiadas Clases y métodos personalizados, por lo que no se enumeran todos los códigos. Los amigos interesados pueden descargarlos al final. Entre ellas, las funciones más importantes:
/**//// <summary>.
/// Leer el contenido RSS del enlace especificado a la base de datos
/// </summary>
/// <param name="id">ID del blog correspondiente</param>
/// <param nombre="url">dirección rss</param>
/// <param name="dt">Última hora de lectura</param>
public void read_from_url (id de cadena, URL de cadena, System.DateTime dt)
{
op_db.db_class db1=nuevo op_db.db_class();
intentar
{
rssFeed feed = new rssFeed(url,dt);//Crear una instancia de clase de lectura rss
feed.read();//Empezar a leer
if(feed.Channel.Items.Count>0)//Si el número de artículos es mayor que 0, comience a leer en la base de datos
{
para(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].descripción,feed.Channel.Items[i].pubDate);
}
db1.sql="actualizar bokequn set last_rss_date='"+feed.lastModified.ToString()+"' donde id="+id;
db1.executesql();
}
}
captura (Excepción ex)
{
common.func.write_log(id+":url:"+url+"Error"+ex.Message+ex.Source+ex.StackTrace);
}
finalmente
{
db1.db_close
();
}
Entre ellos, rssFeed es una clase escrita por mí para procesar RSS. Para esta clase, he usado rss.net de código abierto durante un período de tiempo. Sin embargo, en el proceso real, hay varias direcciones RSS, e incluso muchas. Muchos de ellos no cumplen con los estándares, por lo que encontrará que hubo muchos problemas y, después de mirar el código fuente, había demasiadas cosas con las que quería lidiar y la cantidad de código también era muy grande. A nivel, estimé que no sería posible corregirlo por un tiempo, así que hice un control yo mismo, lo cual no es gran cosa. Los controles son solo algunas categorías. Por supuesto, el contenido que trato es relativamente simple. Solo me ocupo del título e introducción del RSS, el título, introducción, hora y enlace del artículo.
Hay demasiados códigos publicados. Los amigos que estén interesados pueden descargarlo al final.
El uso es bastante simple. Simplemente haga referencia al dll compilado y utilícelo de la siguiente manera:
rssFeed feed = new rssFeed(url,dt);//Crear un. instancia de clase de lectura rss
feed.read();//Empezar a leer
feed.canal.título
feed.canal.descripción
feed.Channel.Items.Count
feed.Channel.Items[i].título
feed.Channel.Items[i].descripción
feed.Channel.Items[i].enlace
El dt en el
constructorfeed.Channel.Items[i].pubDate
representa el tiempo de última lectura, porque el tiempo de modificación del archivo RSS se obtendrá en la clase. Si es mayor que el tiempo de última lectura, se leerá. De lo contrario, no se procesará.Bueno, creo que todos pueden entenderlo de un vistazo.
Todavía hay un problema en la lectura de RSS, es decir, si hay caracteres hexadecimales en algunos archivos xml (por supuesto, esto es poco probable). no se puede leer. Si alguien sabe cómo solucionarlo, hágamelo saber.
Es un poco confuso, pero espero que sea útil para los amigos que necesitan esta función.
Descargas relacionadas: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html