방금 기술 관련 기사를 직접 작성했습니다. 조언을 부탁드립니다. 하하.
원본 기사: http://bbs.5inet.net/topic.aspx?topicid=181
때때로 웹 페이지에서 포럼 정보를 읽어야 할 때가 있습니다. 기존 ASP에서는 JS 또는 IFRAME을 사용합니다. 매우 편리하고 검색 엔진에 친숙하지 않습니다. 이제 .Net을 사용하면 다른 방법이 있습니다.
요구사항: 포럼은 RSS 지원을 제공해야 합니다.
코드는 다음과 같습니다:
#지역과제수업
//특정 작업을 수행하는 작업 클래스입니다.
공개 클래스 RssAsyncTask
{
개인 문자열 _rssContent;
개인 AsyncTaskDelegate _dlgt;
개인 문자열 rssUrl;
개인 bool _success;
공공 bool IsSuccess
{
얻다
{
_성공을 반환합니다.
}
}
공개 RssAsyncTask(문자열 rssUrl)
{
this.rssUrl = rssUrl;
}
// 대리자를 생성합니다.
보호된 대리자 void AsyncTaskDelegate()
공개 문자열 GetRssContent()
{
_rssContent를 반환합니다.
}
공공 무효 DoTheAsyncTask()
{
// 지연된 시뮬레이션을 위해 인위적인 지연을 도입합니다.
// 비동기 작업을 더 크게 만듭니다.
// AsyncTimeout 속성.
WebClient wc = 새로운 WebClient();
노력하다
{
_rssContent = wc.DownloadString(rssUrl);
_성공 = 사실;
}
잡기 (예외 e)
{
_rssContent = e.메시지;
}
마지막으로
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// 호출될 메소드를 정의합니다.
// 비동기 작업을 시작합니다.
공개 IAsyncResult OnBegin(객체 전송자, EventArgs e,
AsyncCallback cb, 개체 extraData)
{
//_rssContent = "비동기 작업을 시작합니다."
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData);
반환 결과;
}
// 다음과 같은 경우 호출될 메서드를 정의합니다.
// 비동기 작업이 종료됩니다.
공개 무효 OnEnd(IAsyncResult ar)
{
//_rssContent = "비동기 작업이 완료되었습니다.";
_dlgt.EndInvoke(ar);
}
// 작업이 실행될 경우 호출될 메서드를 정의합니다.
// 비동기 시간 초과 간격 내에 완료되지 않습니다.
공개 무효 OnTimeout(IAsyncResult ar)
{
_rssContent = "비동기 작업을 완료하지 못했습니다." +
"AsyncTimeout 매개변수를 초과했기 때문입니다.";
}
}
#endregion
//사용자 정의 컨트롤은 다른 사용자 정의 컨트롤에서 상속됩니다.
공개 클래스 RArticle
: L패널
{
#지역 속성
문자열 rssUrl;
공개 문자열 RssUrl
{
{return rssUrl}을 얻습니다.
설정 {rssUrl = 값 }
}
int maxRecordNumber = 6;
공개 int MaxRecordNumber;
{
get {return maxRecordNumber };
설정 { maxRecordNumber = 값 }
}
#endregion
RssAsyncTask 작업;
보호된 재정의 void OnInit(EventArgs e)
{
base.OnInit(e);
task = new RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null)
Page.RegisterAsyncTask(asyncTask);
Page.ExecuteRegisteredAsyncTasks();
}
static Random r = new Random();
보호된 재정의 무효 렌더(System.Web.UI.HtmlTextWriter 작가)
{
문자열 rssContent = task.GetRssContent();
XmlDocument 문서 = null;
if (task.IsSuccess)
{
doc = 새로운 XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/채널/제목").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = true;
}
base.RenderBegin(writer);
작가.WriteBeginTag("div");
writer.WriteAttribute("class", "child2");
맞아(작가);
작가.WriteBeginTag("ul");
오른쪽(작성자);
if (doc != null)
{
#region 성공
XmlNodeList items = doc.SelectNodes("rss/channel/item");
List
foreach(항목의 XmlNode 노드)
node.Add(node);
//일반사항을 사용하여 날짜를 역순으로 정렬합니다.
node.Sort(new Comparison
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
시간 범위 ts = d2 - d1;
(int)ts.TotalSeconds를 반환합니다.
}));
for (int i = 0; i < maxRecordNumber; i++)
{
XmlNode 노드 = 노드[i];
작가.WriteBeginTag("li");
맞아(작가);
작가.WriteBeginTag("a");
작가.WriteAttribute("대상", "_blank");
writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
맞아(작가);
writer.Write(node.SelectSingleNode("제목").InnerText);
작가.WriteEndTag("a");
작가.WriteEndTag("li");
}
#끝지역
}
또 다른
{
작가.WriteBeginTag("pre");
맞아(작가);
작가.쓰기(task.GetRssContent());
작가.WriteEndTag("사전");
}
작가.WriteEndTag("ul");
writer.WriteEndTag("div");
RenderChildren(작가);
base.RenderEnd(writer);
}
}
사용 방법:
1. 등록 관리
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
2. 전화
단순화를 위해 이 프로그램은 캐싱과 같은 기술을 사용하지 않습니다. 필요한 경우 직접 추가하십시오.