Ich habe gerade selbst einen technischen Artikel geschrieben, bitte geben Sie mir Ihren Rat. Ha ha.
Originaler Originalartikel: http://bbs.5inet.net/topic.aspx?topicid=181
Manchmal müssen wir Foreninformationen auf der Webseite lesen. In herkömmlichem ASP verwenden wir diese beiden Methoden sehr praktisch und nicht suchmaschinenfreundlich. Mit .Net haben wir jetzt einen anderen Weg.
Anforderungen: Das Forum muss RSS-Unterstützung bieten.
Der Code lautet wie folgt:
#region-Aufgabenklasse
//Dies ist eine Aufgabenklasse, die bestimmte Aufgaben ausführt
öffentliche Klasse RssAsyncTask
{
privater String _rssContent;
private AsyncTaskDelegate _dlgt;
private Zeichenfolge rssUrl;
privater bool _success;
öffentlicher bool IsSuccess
{
erhalten
{
return _success;
}
}
public RssAsyncTask(string rssUrl)
{
this.rssUrl = rssUrl;
}
// Delegaten erstellen.
protected Delegate void AsyncTaskDelegate();
public String GetRssContent()
{
return _rssContent;
}
public void DoTheAsyncTask()
{
// Führen Sie eine künstliche Verzögerung ein, um eine Verzögerung zu simulieren
// asynchrone Aufgabe. Machen Sie diese größer als die
// AsyncTimeout-Eigenschaft.
WebClient wc = new WebClient();
versuchen
{
_rssContent = wc.DownloadString(rssUrl);
_success = true;
}
Catch (Ausnahme e)
{
_rssContent = e.Message;
}
Endlich
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Definiere die Methode, die aufgerufen wird
// die asynchrone Aufgabe starten.
public IAsyncResult OnBegin(object sender, EventArgs e,
AsyncCallback cb, Objekt extraData)
{
//_rssContent = „Asynchrone Aufgabe wird gestartet.“;
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
IAsyncResult result = _dlgt.BeginInvoke(cb, extraData)
;
}
// Definiere die Methode, die wann aufgerufen wird
// Die asynchrone Aufgabe wird beendet.
public void OnEnd(IAsyncResult ar)
{
//_rssContent = „Asynchrone Aufgabe abgeschlossen.“;
_dlgt.EndInvoke(ar);
}
// Definiere die Methode, die bei der Aufgabe aufgerufen wird
// wird nicht innerhalb des asynchronen Timeout-Intervalls abgeschlossen.
public void OnTimeout(IAsyncResult ar)
{
_rssContent = „Ansynchrone Aufgabe konnte nicht abgeschlossen werden“ +
„weil der AsyncTimeout-Parameter überschritten wurde.“;
}
}
#endregion
//Ein benutzerdefiniertes Steuerelement erbt von einem anderen benutzerdefinierten Steuerelement.
öffentliche Klasse RArticle
: LPanel
{
#region-Eigenschaften
Zeichenfolge rssUrl;
öffentliche Zeichenfolge RssUrl
{
get { return rssUrl }
set { rssUrl = value }
}
int maxRecordNumber = 6;
public int MaxRecordNumber
{
get { return maxRecordNumber }
set { maxRecordNumber = value;
}
#endregion
RssAsyncTask-Aufgabe;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
task = new RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null)
;
Page.ExecuteRegisteredAsyncTasks();
}
static Random r = new Random();
protected override void Render(System.Web.UI.HtmlTextWriter-Writer)
{
string rssContent = task.GetRssContent();
XmlDocument doc = null;
if (task.IsSuccess)
{
doc = neues XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = true;
}
base.RenderBegin(writer);
writer.WriteBeginTag("div");
write.WriteAttribute("class", "child2");
Richtig(Schriftsteller);
Writer.WriteBeginTag("ul");
Right(writer);
if (doc != null)
{
#region success
XmlNodeList items = doc.SelectNodes("rss/channel/item");
List<XmlNode> nodes = new List<XmlNode>();
foreach (XmlNode-Knoten in Elementen)
nodes.Add(node);
//Generika verwenden, um Daten in umgekehrter Reihenfolge zu sortieren
nodes.Sort(neuer Vergleich<XmlNode>(delegate(XmlNode n1, XmlNode n2)
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
TimeSpan ts = d2 - d1;
return (int)ts.TotalSeconds;
}));
for (int i = 0; i < maxRecordNumber; i++)
{
XmlNode node = nodes[i];
Writer.WriteBeginTag("li");
Richtig(Schriftsteller);
Writer.WriteBeginTag("a");
Writer.WriteAttribute("target", "_blank");
write.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Richtig(Schriftsteller);
write.Write(node.SelectSingleNode("title").InnerText);
write.WriteEndTag("a");
Writer.WriteEndTag("li");
}
#endregion
}
anders
{
write.WriteBeginTag("pre");
Richtig(Schriftsteller);
write.Write(task.GetRssContent());
Writer.WriteEndTag("pre");
}
writer.WriteEndTag("ul");
write.WriteEndTag("div");
RenderChildren(writer);
base.RenderEnd(writer);
}
}
Anwendung:
1. Registrierungskontrolle
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
2. Rufen Sie an
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
Der Einfachheit halber verwendet dieses Programm keine Technologien wie Caching. Bitte fügen Sie es bei Bedarf selbst hinzu.