เมื่อไม่นานมานี้ ฉันได้สร้างเว็บไซต์โปรโมตบล็อก: Chinese Blog Group ( http://www.bokqun.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.เปิดใช้งาน=จริง;
if(common.func.get_key("can_do")=="1")//ยังเข้าถึงได้ใน web.config ว่าจะดำเนินการประมวลผลปกติหรือไม่ โดยที่ common.func.get_key เป็นฟังก์ชันแบบกำหนดเองเพื่อรับการตั้งค่า
t.Elapsed + = System.Timers.ElapsedEventHandler ใหม่ (สนุก);
รหัสฟังก์ชั่นความสนุก:
ความสนุกสนานเป็นโมฆะส่วนตัว (ผู้ส่งวัตถุ 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));//เขียนเวลาดำเนินการนี้ลงในบันทึก
-
จับ (ข้อยกเว้นเช่น)
-
common.func.write_log("เกิดข้อผิดพลาดในการอ่านไฟล์ xml ระยะไกล:"+ex.Message);//เขียนบันทึก
-
-
รหัสใน Global.asax เสร็จสมบูรณ์
2 ขั้นตอนต่อไปคือการรับรายการ rss จากฐานข้อมูลในคลาส rss2sql อ่านไฟล์ rss ตามเวลา rss ที่อ่านครั้งล่าสุดและเวลาแก้ไขของไฟล์ rss แล้วเขียนลงใน ฐานข้อมูลเนื่องจากมีการใช้งานคลาสและวิธีการที่กำหนดเองมากเกินไป ดังนั้นรหัสทั้งหมดจึงไม่อยู่ในรายการ เพื่อนที่สนใจสามารถดาวน์โหลดได้ในตอนท้าย ฟังก์ชั่นที่สำคัญกว่า:
/**//// <summary>
/// อ่านเนื้อหา RSS ของลิงค์ที่ระบุไปยังฐานข้อมูล
/// </สรุป>
/// <param name="id">id ของบล็อกที่เกี่ยวข้อง</param>
/// <param name="url">ที่อยู่ rss</param>
/// <param name="dt">เวลาอ่านล่าสุด</param>
โมฆะสาธารณะ read_from_url (รหัสสตริง, URL สตริง, System.DateTime dt)
-
op_db.db_class db1=ใหม่ op_db.db_class();
พยายาม
-
rssFeed feed = new rssFeed(url,dt);//สร้างอินสแตนซ์คลาสการอ่าน rss
feed.read();//เริ่มอ่าน
if(feed.Channel.Items.Count>0)//หากจำนวนบทความมากกว่า 0 ให้เริ่มอ่านลงในฐานข้อมูล
-
สำหรับ(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="อัพเดต bokequn ตั้ง Last_rss_date='"+feed.lastModified.ToString()+"' โดยที่ id="+id;
db1.executesql();
-
-
จับ (ข้อยกเว้นเช่น)
-
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();//เริ่มอ่าน
feed.Channel.title
feed.Channel.description
feed.Channel.Items.Count
feed.Channel.Items[i].title
feed.Channel.Items[i].คำอธิบาย
feed.Channel.Items[i].link
dt ใน
feed.Channel.Items[i].pubDate
Constructor แสดงถึงเวลาในการอ่านครั้งล่าสุด เนื่องจากเวลาแก้ไขของไฟล์ RSS จะได้รับในชั้นเรียน หากมากกว่าเวลาอ่านครั้งล่าสุด ก็จะถูกอ่าน ไม่เช่นนั้นจะไม่ได้รับการประมวลผลโอเค ฉันเชื่อว่าทุกคนสามารถเข้าใจได้อย่างรวดเร็ว
ยังคงมีปัญหาในการอ่าน RSS นั่นคือหากมีอักขระเลขฐานสิบหกในไฟล์ xml บางไฟล์ (แน่นอนว่าไม่น่าจะเป็นไปได้) ไม่สามารถอ่านได้ ซึ่งถ้าใครรู้วิธีแก้ช่วยบอกหน่อยนะครับ
มันค่อนข้างสับสน แต่ฉันหวังว่ามันจะเป็นประโยชน์กับเพื่อน ๆ ที่ต้องการฟังก์ชันนี้
การดาวน์โหลดที่เกี่ยวข้อง: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html