Há algum tempo, criei um site de promoção de blog: Chinese Blog Group ( http://www.bokequn.cn ). Ele contém uma função que pode ler regularmente as informações do artigo do blog no banco de dados e exibi-las para os usuários. para consultar. E processar TAG Por ser um host virtual, só pensei em usar o timer do lado do servidor para resolver isso.
Naquela época eu estava com pressa e não tinha tempo para otimizar, e meu nível era muito limitado. Se você acha que algo está errado ou que existe uma maneira melhor de resolver, fique à vontade para me esclarecer.
Acho que há dois pontos-chave em todo o processo:
como lidar com o cronômetro
Modularize a leitura de RSS para facilitar as ligações
1. Em relação ao temporizador, é claro que está escrito em Global.asax. Primeiro crie a variável:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time " ]));
Entre eles, do_time é usado no web.config para acessar a frequência com que ele é executado
e depois processado em Application_Start:
t.AutoReset=true;
t.Enabled=true;
if(common.func.get_key("can_do")=="1")//Também é acessado em web.config se deve realizar processamento regular, onde common.func.get_key é uma função personalizada para obter configurações
t.Elapsed + = novo System.Timers.ElapsedEventHandler (divertido);
Código de função divertido:
diversão privada vazia (remetente do objeto, System.Timers.ElapsedEventArgs e)
{
tentar
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("Iniciar leitura de XML remoto");//Escrever log
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Agora;
common.func.write_log("Arquivo XML importado para o banco de dados com sucesso"+Convert.ToString(dt2-dt));//Grava este tempo de execução no log,
}
catch(Exceção ex)
{
common.func.write_log("Erro ao ler arquivo xml remoto:"+ex.Message);//Escrever log
}
}
O código em Global.asax é concluído
2. A próxima etapa é obter a lista rss do banco de dados na classe rss2sql, ler o arquivo rss com base na hora da última leitura rss e na hora de modificação do arquivo rss e gravá-lo em o banco de dados, porque muitas classes e métodos personalizados são usados, então todos os códigos não estão listados no final. Entre eles, as funções mais importantes:
/**//// <summary>.
/// Ler o conteúdo RSS do link especificado para o banco de dados
/// </sumário>
/// <param name="id">O id do blog correspondente</param>
/// <param name="url">endereço RSS</param>
/// <param name="dt">Hora da última leitura</param>
público void read_from_url(string id,string url,System.DateTime dt)
{
op_db.db_class db1=novo op_db.db_class();
tentar
{
rssFeed feed = new rssFeed(url,dt);//Cria uma instância de classe de leitura de rss
feed.read(); //Começa a ler
if(feed.Channel.Items.Count>0)//Se o número de artigos for maior que 0, comece a ler no banco de dados
{
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="atualizar bokequn set last_rss_date='"+feed.lastModified.ToString()+"' onde id="+id;
db1.executesql();
}
}
catch(Exceção ex)
{
common.func.write_log(id+":url:"+url+"Erro"+ex.Message+ex.Source+ex.StackTrace);
}
finalmente
{
db1.db_close()
;
}
Entre eles, rssFeed é uma classe escrita por mim para processar RSS. Para esta classe, usei o rss.net de código aberto por um período de tempo. No entanto, no processo real, existem vários endereços RSS, e até mesmo muitos. deles não atendem aos padrões, então você encontrará muitos problemas e, depois de olhar o código-fonte, havia muitas coisas com as quais ele queria lidar, e a quantidade de código também era muito grande. nível, estimei que não seria possível corrigi-lo por um tempo, então fiz um controle sozinho, o que não é grande coisa. Os controles são apenas algumas categorias. Claro, o conteúdo com o qual lido é relativamente simples. Eu trato apenas do título e da introdução do RSS, do título, da introdução, da hora e do link do item.
Existem muitos códigos postados. Amigos interessados podem baixá-lo no final.
O uso é bastante simples. Basta referenciar a dll compilada e usá-la da seguinte forma:
rssFeed feed = new rssFeed(url,dt);//Crie um. instância de classe de leitura de rss
feed.read(); //Começa a ler
feed.canal.título
feed.Canal.descrição
feed.Channel.Items.Count
feed.Channel.Items[i].title
feed.Channel.Items[i].descrição
feed.Channel.Items[i].link
O dt no
construtorfeed.Channel.Items[i].pubDate
representa o horário da última leitura, pois o horário de modificação do arquivo RSS será obtido na classe. Se for maior que o horário da última leitura, ele será lido. , caso contrário não será processado.Ok, acredito que todos possam entender rapidamente.
Ainda há um problema na leitura de RSS. Ou seja, se houver caracteres hexadecimais em alguns arquivos xml (claro, isso é improvável). não pode ser lido. Se alguém souber como resolver, por favor me avise.
É um pouco confuso, mas espero que seja útil para amigos que precisam dessa função.
Downloads relacionados: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html