얼마 전 저는 블로그 홍보 웹사이트인 중국 블로그 그룹( 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;
t.Enabled=true;
if(common.func.get_key("can_do")=="1")//일반 처리를 수행할지 여부는 web.config에서도 액세스됩니다. 여기서 common.func.get_key는 설정을 가져오는 사용자 정의 함수입니다.
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
기능 재미의 코드:
개인 무효 재미(객체 전송자, System.Timers.ElapsedEventArgs e)
{
노력하다
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("원격 XML 읽기 시작");//로그 쓰기
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML 파일을 데이터베이스로 성공적으로 가져왔습니다."+Convert.ToString(dt2-dt));//이 실행 시간을 로그에 기록하고,
}
catch(예외예외)
{
common.func.write_log("원격 xml 파일 읽기 오류:"+ex.Message);//로그 쓰기
}
}
Global.asax의 코드가 완성되었습니다.
2. 다음 단계는 rss2sql 클래스의 데이터베이스에서 rss 목록을 얻고, 마지막으로 읽은 rss 시간과 rss 파일의 수정 시간을 기반으로 rss 파일을 읽고 rss 파일에 쓰는 것입니다. 너무 많은 사용자 정의 클래스 및 메소드가 사용되므로 모든 코드가 나열되지 않습니다. 관심 있는 친구는 마지막에 다운로드할 수 있습니다.
/**//// <summary>
/// 데이터베이스에 대한 지정된 링크의 RSS 콘텐츠를 읽습니다.
/// </summary>
/// <param name="id">해당 블로그 아이디</param>
/// <param name="url">rss 주소</param>
/// <param name="dt">마지막으로 읽은 시간</param>
공개 무효 read_from_url(문자열 ID, 문자열 URL, System.DateTime dt)
{
op_db.db_class db1=new op_db.db_class();
노력하다
{
rssFeed 피드 = 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();
}
}
catch(예외예외)
{
common.func.write_log(id+":url:"+url+"Error"+ex.Message+ex.Source+ex.StackTrace);
}
마지막으로
{
db1.db_close()
}
}
그 중 rssFeed는 RSS를 처리하기 위해 제가 직접 작성한 클래스입니다. 이 클래스에서는 예전부터 오픈소스인 rss.net을 사용해왔지만, 실제 과정에서는 다양한 RSS 주소가 존재하기도 합니다. 그 중 표준을 충족하지 못하므로 문제가 많이 발생하고 소스 코드를 살펴보니 처리하고 싶은 내용이 너무 많았고 코드의 양도 매우 컸습니다. 레벨은 당분간 수정이 불가능할 것으로 판단하여 직접 컨트롤을 만들어 보았는데 별것 아닌 일입니다. 물론 제가 다루는 내용은 비교적 간단합니다. .RSS의 제목과 소개, 항목의 제목, 소개, 시간, 링크만 다룹니다.
게시된 코드가 너무 많습니다. 관심 있는 친구는 마지막에 다운로드할 수 있습니다.
사용법은 매우 간단합니다. 컴파일된 dll을 참조하고 다음과 같이 사용하면 됩니다.
rssFeed Feed = new rssFeed(url,dt);//Create an RSS 읽기 클래스 인스턴스
Feed.read();//읽기 시작
피드.채널.제목
피드.채널.설명
피드.채널.항목.개수
피드.채널.항목[i].제목
피드.채널.항목[i].설명
피드.채널.항목[i].link
Feed.Channel.Items[i].pubDate
의 dt는
마지막 읽기 시간을 나타냅니다. RSS 파일의 수정 시간이 클래스에서 얻어지기 때문입니다. 마지막 읽기 시간보다 크면 읽어집니다.그렇지
않으면 처리되지 않습니다.RSS 읽기에는 여전히 문제가 있습니다. 즉, 일부 XML 파일에 16진수 문자가 있는 경우(물론 그럴 가능성은 낮습니다) 읽을 수 없습니다. 해결 방법을 아시는 분은 알려주세요.
조금 헷갈리긴 하지만 이 기능이 필요한 친구들에게 도움이 되었으면 좋겠습니다.
관련 다운로드: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html