Je viens d'écrire moi-même un article technique, merci de me donner vos conseils. Ha ha.
Article original original : http://bbs.5inet.net/topic.aspx?topicid=181
Parfois, nous avons besoin de lire les informations du forum sur la page Web. Dans l'ASP traditionnel, nous utilisons JS ou IFRAME. Ces deux méthodes ne sont pas disponibles. très pratique et peu convivial pour les moteurs de recherche. Maintenant, avec .Net, nous avons une autre solution.
Exigences : Le forum doit fournir un support RSS.
Le code est le suivant :
Classe de tâches #region
//Il s'agit d'une classe de tâches qui effectue des tâches spécifiques
classe publique RssAsyncTask
{
chaîne privée _rssContent ;
privé AsyncTaskDelegate _dlgt ;
chaîne privée rssUrl ;
bool privé _success ;
bool public IsSuccess
{
obtenir
{
retourner _succès ;
}
}
public RssAsyncTask (chaîne rssUrl)
{
this.rssUrl = rssUrl;
}
// Créer un délégué.
délégué protégé void AsyncTaskDelegate();
public String GetRssContent()
{
retourner _rssContent ;
}
public void DoTheAsyncTask()
{
// Introduire un retard artificiel pour simuler un retard
// Tâche asynchrone. Rendre cette valeur supérieure à la
// Propriété AsyncTimeout.
WebClient wc = new WebClient();
essayer
{
_rssContent = wc.DownloadString(rssUrl);
_succès = vrai ;
}
attraper (exception e)
{
_rssContent = e.Message ;
}
enfin
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Définit la méthode qui sera appelée
// démarre la tâche asynchrone.
public IAsyncResult OnBegin (expéditeur d'objet, EventArgs e,
AsyncCallback cb, objet extraData)
{
//_rssContent = "Début de la tâche asynchrone.";
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
Résultat IAsyncResult = _dlgt.BeginInvoke(cb, extraData);
résultat de retour ;
}
// Définit la méthode qui sera appelée lorsque
// la tâche asynchrone est terminée.
public void OnEnd (IAsyncResult ar)
{
//_rssContent = "Tâche asynchrone terminée.";
_dlgt.EndInvoke(ar);
}
// Définit la méthode qui sera appelée si la tâche
// n'est pas terminé dans le délai d'expiration asynchrone.
public void OnTimeout (IAsyncResult ar)
{
_rssContent = "La tâche ansynchrone n'a pas pu se terminer " +
"car il a dépassé le paramètre AsyncTimeout.";
}
}
#endregion
//Un contrôle personnalisé hérite d'un autre contrôle personnalisé.
classe publique RArticle
: LPanneau
{
Propriétés de la #région
chaîne rssUrl ;
chaîne publique RssUrl
{
obtenir { retourner rssUrl ;
définir { rssUrl = valeur }
}
int maxRecordNumber = 6;
public int MaxRecordNumber
{
obtenir { return maxRecordNumber }
définir { maxRecordNumber = valeur }
}
#endregion
Tâche RssAsyncTask ;
remplacement protégé void OnInit (EventArgs e)
{
base.OnInit(e);
tâche = nouveau RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null
Page.RegisterAsyncTask(asyncTask);
Page.ExecuteRegisteredAsyncTasks();
}
static Random r = new Random();
remplacement protégé void Render (écrivain System.Web.UI.HtmlTextWriter)
{
chaîne rssContent = task.GetRssContent();
Document XmlDocument = null ;
si (tâche.IsSuccess)
{
doc = nouveau 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");
écrivain.WriteAttribute("classe", "enfant2");
Droite(écrivain);
écrivain.WriteBeginTag("ul");
Droite(écrivain);
if (doc != null)
{
#region success
XmlNodeList items = doc.SelectNodes("rss/channel/item");
List<XmlNode> nodes = new List<XmlNode>();
foreach (nœud XmlNode dans les éléments)
nodes.Add(node);
//Utiliser des génériques pour trier les dates dans l'ordre inverse
nodes.Sort(nouvelle comparaison<XmlNode>(délégué(XmlNode n1, XmlNode n2)
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
TimeSpants = d2 - d1 ;
return (int)ts.TotalSeconds;
}));
pour (int i = 0; i < maxRecordNumber; i++)
{
Noeud XmlNode = noeuds[i];
écrivain.WriteBeginTag("li");
Droite(écrivain);
écrivain.WriteBeginTag("a");
écrivain.WriteAttribute("target", "_blank");
writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Droite(écrivain);
écrivain.Write(node.SelectSingleNode("titre").InnerText);
écrivain.WriteEndTag("a");
écrivain.WriteEndTag("li");
}
#endregion
}
autre
{
écrivain.WriteBeginTag("pre");
Droite(écrivain);
écrivain.Write(task.GetRssContent());
écrivain.WriteEndTag("pre");
}
écrivain.WriteEndTag("ul");
écrivain.WriteEndTag("div");
RenderChildren(écrivain
base.RenderEnd(écrivain);
}
}
Comment utiliser :
1. Contrôle des inscriptions
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
2. Appelez
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
Par souci de simplicité, ce programme n'utilise pas de technologies telles que la mise en cache. Si nécessaire, veuillez l'ajouter vous-même.