Некоторое время назад я создал сайт для продвижения блога: Chinese Blog Group ( http://www.bokequn.cn ). В нем есть функция, которая может регулярно считывать информацию о статьях блога в базу данных, а затем отображать ее для пользователей. для запроса и обработки TAG. Поскольку это виртуальный хост, я думал только об использовании серверного таймера для его решения.
В то время я спешил и у меня не было времени на оптимизацию, а мой уровень был очень ограничен. Если вы считаете, что что-то не так или есть лучший способ решить эту проблему, пожалуйста, просветите меня.
Я думаю, что во всем процессе есть два ключевых момента:
как быть с таймером
Модулируйте чтение RSS, чтобы было проще звонить
1. Что касается таймера, то он, конечно, написан в Global.asax. Сначала создайте переменную:
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time) " ]));
Среди них do_time используется в web.config для определения частоты его выполнения,
а затем обрабатывается в Application_Start:
t.AutoReset=true;
т.Включено=истина;
if(common.func.get_key("can_do")=="1")//В web.config также можно получить доступ к тому, выполнять ли регулярную обработку, где common.func.get_key — это пользовательская функция для получения настроек
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
Код функции fun:
Private void fun (отправитель объекта, System.Timers.ElapsedEventArgs e)
{
пытаться
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("Начать чтение удаленного XML");//Записать журнал
rss2sql rl=new rss2sql();
рл.читать();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML-файл успешно импортирован в базу данных"+Convert.ToString(dt2-dt));//Запишите это время выполнения в журнал,
}
поймать (исключение ex)
{
common.func.write_log("Ошибка чтения удаленного XML-файла:"+ex.Message);//Запись журнала
}
}
Код в Global.asax завершен
. 2. Следующим шагом является получение списка rss из базы данных в классе rss2sql, чтение rss-файла на основе времени последнего чтения rss и времени модификации rss-файла и запись его в в базе данных, поскольку используется слишком много настраиваемых классов и методов, поэтому все коды не указаны. Заинтересованные друзья могут загрузить их в конце. Среди них наиболее важные функции:
/**//// <summary>.
/// Читаем RSS-содержимое указанной ссылки в базу данных
/// </сводка>
/// <param name="id">Идентификатор соответствующего блога</param>
/// <param name="url">rss-адрес</param>
/// <param name="dt">Время последнего чтения</param>
public void read_from_url(идентификатор строки, URL-адрес строки, System.DateTime dt)
{
op_db.db_class db1 = новый op_db.db_class();
пытаться
{
rssFeedfeed = new rssFeed(url,dt);//Создаем экземпляр класса чтения RSS
Feed.read();//Начало чтения
if(feed.Channel.Items.Count>0)//Если количество статей больше 0, начинаем чтение в базу данных
{
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()+"' где id="+id;
db1.executesql();
}
}
поймать (исключение ex)
{
common.func.write_log(id+":url:"+url+"Error"+ex.Message+ex.Source+ex.StackTrace);
}
окончательно
{
db1.db_close
();
}
Среди них rssFeed — это класс, написанный мной для обработки RSS. Для этого класса я уже некоторое время использовал rss.net с открытым исходным кодом. Однако в реальном процессе существуют различные адреса RSS, и даже много. из них не соответствуют стандартам, поэтому вы столкнетесь с множеством проблем, и после просмотра исходного кода было слишком много вещей, с которыми он хотел разобраться, и объем кода также был очень большим. Уровень, я прикинул, что исправить это через какое-то время не получится, поэтому я сделал элемент управления самостоятельно, что не имеет большого значения. Элементы управления состоят всего из нескольких категорий. Конечно, контент, с которым я имею дело, относительно прост. Я имею дело только с названием и введением RSS, названием, введением, временем и ссылкой на элемент.
Опубликовано слишком много кодов. Друзья, которым интересно, могут скачать его в конце.
Использование довольно простое: просто укажите ссылку на скомпилированную dll и используйте ее следующим образом:
rssFeedfeed = new rssFeed(url,dt);//Создайте. Экземпляр класса чтения RSS
Feed.read();//Начало чтения
канал.Channel.title
канал.Channel.description
фид.Channel.Items.Count
фид.Channel.Items[i].title
фид.Channel.Items[i].description
фид.Channel.Items[i].link
dt в
конструктореfeed.Channel.Items[i].pubDate
представляет время последнего чтения, поскольку время модификации RSS-файла будет получено в классе. Если оно больше, чем время последнего чтения, оно будет прочитано. , иначе он не будет обработан.Ладно, думаю всем понятно с первого взгляда.
Есть еще проблема с чтением RSS. То есть если в некоторых xml файлах есть шестнадцатеричные символы (это, конечно, маловероятно), то это так. невозможно прочитать. Если кто-нибудь знает, как это решить, пожалуйста, дайте мне знать.
Это немного запутанно, но я надеюсь, что это будет полезно друзьям, которым нужна эта функция.
Похожие загрузки: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html.