ฉันเพิ่งเขียนบทความทางเทคนิคด้วยตัวเอง โปรดให้คำแนะนำแก่ฉันด้วย ฮ่า.
บทความต้นฉบับ: http://bbs.5inet.net/topic.aspx?topicid=181
บางครั้งเราจำเป็นต้องอ่านข้อมูลฟอรัมบนหน้าเว็บ ใน ASP แบบดั้งเดิม เราใช้ JS หรือ IFRAME ทั้งสองวิธีนี้ไม่มี สะดวกมากและไม่เป็นมิตรกับเครื่องมือค้นหา ขณะนี้ด้วย .Net เรามีวิธีอื่น
ข้อกำหนด: ฟอรัมจำเป็นต้องให้การสนับสนุน RSS
รหัสมีดังนี้:
#คลาสงานภูมิภาค
//นี่คือคลาสงานที่ดำเนินงานเฉพาะ
RssAsyncTask คลาสสาธารณะ
-
สตริงส่วนตัว _rssContent;
AsyncTaskDelegate ส่วนตัว _dlgt;
สตริงส่วนตัว rssUrl;
บูลส่วนตัว _success;
บูลสาธารณะ IsSuccess
-
รับ
-
กลับ _สำเร็จ;
-
}
RssAsyncTask สาธารณะ (สตริง rssUrl)
-
this.rssUrl = rssUrl;
}
// สร้างผู้รับมอบสิทธิ์
ผู้รับมอบสิทธิ์ที่ได้รับการป้องกันเป็นโมฆะ AsyncTaskDelegate ();
สตริงสาธารณะ GetRssContent ()
-
กลับ _rssContent;
-
โมฆะสาธารณะ DoTheAsyncTask()
-
// แนะนำความล่าช้าเทียมเพื่อจำลองความล่าช้า
// งานอะซิงโครนัส ทำให้สิ่งนี้ยิ่งใหญ่กว่า
// คุณสมบัติ AsyncTimeout
WebClient wc = WebClient ใหม่ ();
พยายาม
-
_rssContent = wc.DownloadString(rssUrl);
_สำเร็จ = จริง;
-
จับ (ยกเว้น e)
-
_rssContent = อีเมล;
-
ในที่สุด
-
wc.ทิ้ง();
-
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// กำหนดวิธีการที่จะเรียกใช้
// เริ่มงานอะซิงโครนัส
IAsyncResult สาธารณะ OnBegin (ผู้ส่งวัตถุ EventArgs e,
AsyncCallback cb, วัตถุ extraData)
-
//_rssContent = "เริ่มต้นงาน async";
_dlgt = AsyncTaskDelegate ใหม่ (DoTheAsyncTask);
ผลลัพธ์ IAsyncResult = _dlgt.BeginInrigg(cb, extraData)
;
}
// กำหนดวิธีการที่จะเรียกเมื่อใด
// งานอะซิงโครนัสสิ้นสุดลง
โมฆะสาธารณะ OnEnd (IAsyncResult ar)
-
//_rssContent = "งานอะซิงโครนัสเสร็จสมบูรณ์";
_dlgt.EndInvoke(ar);
}
// กำหนดวิธีการที่จะถูกเรียกหากงานนั้น
// ไม่สมบูรณ์ภายในช่วงเวลาหมดเวลาแบบอะซิงโครนัส
โมฆะสาธารณะ OnTimeout (IAsyncResult ar)
-
_rssContent = "งานอะซิงโครนัสล้มเหลวในการดำเนินการให้เสร็จสิ้น" +
"เพราะมันเกินพารามิเตอร์ AsyncTimeout";
-
-
#endregion
//การควบคุมแบบกำหนดเองสืบทอดมาจากการควบคุมแบบกำหนดเองอื่น
RArticle คลาสสาธารณะ
: LPanel
-
#คุณสมบัติของภูมิภาค
สตริง rssUrl;
สตริงสาธารณะ RssUrl
-
รับ { กลับ rssUrl;
ตั้งค่า { rssUrl = ค่า;
}
int maxRecordNumber = 6;
int MaxRecordNumber สาธารณะ
-
รับ { กลับ maxRecordNumber;
ตั้งค่า { maxRecordNumber = ค่า;
-
#endregion
งาน RssAsyncTask;
การป้องกันการแทนที่เป็นโมฆะ OnInit (EventArgs e)
-
ฐาน OnInit(e);
งาน = RssAsyncTask ใหม่ (this.rssUrl);
PageAsyncTask asyncTask = PageAsyncTask ใหม่ (task.OnBegin, job.OnEnd, job.OnTimeout, null);
Page.RegisterAsyncTask (asyncTask);
หน้า ExecuteRegisteredAsyncTasks();
}
สุ่มคงที่ r = สุ่มใหม่ ();
ป้องกันแทนที่เป็นโมฆะ Render (ตัวเขียน System.Web.UI.HtmlTextWriter)
-
สตริง rssContent = งาน GetRssContent ();
เอกสาร XmlDocument = null;
ถ้า (งาน IsSuccess)
-
doc = XmlDocument ใหม่ ();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = จริง;
-
base.RenderBegin(ผู้เขียน);
writer.WriteBeginTag("div");
Writer.WriteAttribute("คลาส", "child2");
ขวา(นักเขียน);
writer.WriteBeginTag("ul");
ขวา(ผู้เขียน);
ถ้า (doc != null)
-
#region ความสำเร็จ
รายการ XmlNodeList = doc.SelectNodes("rss/channel/item");
รายการ <XmlNode> โหนด = รายการใหม่ <XmlNode>();
foreach (โหนด XmlNode ในรายการ)
nodes.Add(node);
//ใช้ Generics เพื่อเรียงลำดับวันที่แบบย้อนกลับ
nodes.Sort (การเปรียบเทียบใหม่ <XmlNode> (ผู้รับมอบสิทธิ์ (XmlNode n1, XmlNode n2)
-
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
ช่วงเวลา ts = d2 - d1;
กลับ (int) ts.TotalSeconds;
}));
สำหรับ (int i = 0; i < maxRecordNumber; i++)
-
โหนด XmlNode = โหนด [i];
writer.WriteBeginTag("li");
ขวา(นักเขียน);
writer.WriteBeginTag("a");
writer.WriteAttribute("เป้าหมาย", "_blank");
writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
ขวา(นักเขียน);
write.Write(node.SelectSingleNode("title").InnerText);
writer.WriteEndTag("a");
writer.WriteEndTag("li");
}
#endregion
-
อื่น
-
writer.WriteBeginTag("ก่อน");
ขวา(นักเขียน);
นักเขียนเขียน(task.GetRssContent());
writer.WriteEndTag("ก่อน");
}
writer.WriteEndTag("ul");
writer.WriteEndTag("div");
)
;
-
-
วิธีใช้:
1. การควบคุมการลงทะเบียน
<%@ Register Assembly = "การควบคุม" Namespace = "Limited.Controls" TagPrefix = "lm" %>
2. โทร
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
เพื่อความเรียบง่าย โปรแกรมนี้ไม่ได้ใช้เทคโนโลยี เช่น การแคช หากจำเป็น โปรดเพิ่มด้วยตนเอง