Yo mismo acabo de escribir un artículo técnico, por favor dame tu consejo. Ja ja.
Artículo original original: http://bbs.5inet.net/topic.aspx?topicid=181
A veces necesitamos leer información del foro en la página web. En ASP tradicional, usamos JS o IFRAME. Estos dos Ninguno de estos métodos. muy conveniente y no amigable para los motores de búsqueda. Ahora con .Net tenemos otra manera.
Requisitos: el foro debe proporcionar soporte RSS.
El código es el siguiente:
#clase de tarea de región
//Esta es una clase de tarea que realiza tareas específicas
clase pública RssAsyncTask
{
cadena privada _rssContent;
privado AsyncTaskDelegate _dlgt;
cadena privada rssUrl;
bool privado _éxito;
bool público IsSuccess
{
conseguir
{
devolver _éxito;
}
}
pública RssAsyncTask (cadena rssUrl)
{
this.rssUrl = rssUrl;
}
// Crear delegado.
delegado protegido void AsyncTaskDelegate()
cadena pública GetRssContent();
{
devolver _rssContenido;
}
vacío público DoTheAsyncTask()
{
// Introducir un retraso artificial para simular un retraso
// tarea asincrónica. Haz que esto sea mayor que el
// Propiedad AsyncTimeout.
WebClient wc = nuevo WebClient();
intentar
{
_rssContent = wc.DownloadString(rssUrl);
_éxito = verdadero;
}
captura (Excepción e)
{
_rssContent = e.Mensaje;
}
finalmente
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Definir el método al que se llamará
// inicia la tarea asincrónica.
público IAsyncResult OnBegin (remitente del objeto, EventArgs e,
AsyncCallback cb, objeto extraData)
{
//_rssContent = "Comenzando tarea asíncrona.";
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
Resultado IAsyncResult = _dlgt.BeginInvoke(cb, extraData
devuelve resultado);
}
// Definir el método que será llamado cuando
// la tarea asincrónica finaliza.
vacío público OnEnd (IAsyncResult ar)
{
//_rssContent = "Tarea asíncrona completada.";
_dlgt.EndInvoke(ar);
}
// Definir el método que será llamado si la tarea
// no se completa dentro del intervalo de tiempo de espera asíncrono.
vacío público OnTimeout (IAsyncResult ar)
{
_rssContent = "La tarea anincrónica no se pudo completar" +
"porque excedió el parámetro AsyncTimeout.";
}
}
#endregion
//Un control personalizado hereda de otro control personalizado.
artículo de clase pública R
: LPanel
{
#propiedades de región
cadena rssUrl;
cadena pública RssUrl
{
obtener {return rssUrl}
establecer { rssUrl = valor }
}
int maxRecordNumber = 6;
público int MaxRecordNumber
{
obtener {return maxRecordNumber}
establecer { maxRecordNumber = valor }
}
#endregion
tarea RssAsyncTask;
anulación protegida anulación OnInit (EventArgs e)
{
base.OnInit(e);
tarea = nueva RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = nueva PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null)
;
Página.ExecuteRegisteredAsyncTasks();
}
estático Aleatorio r = nuevo Aleatorio();
anulación protegida void Render (escritor System.Web.UI.HtmlTextWriter)
{
cadena rssContent = tarea.GetRssContent();
Documento XmlDocument = nulo;
si (tarea.IsSuccess)
{
doc = nuevo documento Xml();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/canal/título").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = verdadero;
}
base.RenderBegin(escritor.WriteBeginTag
("div");
escritor.WriteAttribute("clase", "niño2");
Derecha(escritor);
escritor.WriteBeginTag("ul");
Derecha (escritor);
si (doc! = nulo)
{
#región exitosa
XmlNodeList elementos = doc.SelectNodes("rss/channel/item");
Lista<XmlNode> nodos = nueva Lista<XmlNode>();
foreach (nodo XmlNode en elementos)
nodes.Add(node);
//Usa genéricos para ordenar las fechas en orden inverso
nodos.Ordenar(nueva Comparación<XmlNode>(delegar(XmlNode n1, XmlNode n2)
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
Intervalo de tiempo ts = d2 - d1;
devolver (int)ts.TotalSeconds;
}));
para (int i = 0; i < maxRecordNumber; i++)
{
Nodo XmlNode = nodos[i];
escritor.WriteBeginTag("li");
Derecha(escritor);
escritor.WriteBeginTag("a");
escritor.WriteAttribute("destino", "_blank");
escritor.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Derecha(escritor);
escritor.Write(node.SelectSingleNode("title").InnerText);
escritor.WriteEndTag("a");
escritor.WriteEndTag("li");
}
#endregion
}
demás
{
escritor.WriteBeginTag("pre");
Derecha(escritor);
escritor.Write(tarea.GetRssContent());
escritor.WriteEndTag("pre");
}
escritor.WriteEndTag("ul");
escritor.WriteEndTag("div");
RenderChildren(escritor
base.RenderEnd(escritor);
}
}
Cómo utilizar:
1. Control de registro
<%@ Registro Asamblea="Controles" Espacio de nombres="Controles.Limitados" TagPrefix="lm" %>
2. Llamar
<lm:RArticle ID="RArticle1" runat="servidor" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
En aras de la simplicidad, este programa no utiliza tecnologías como el almacenamiento en caché. Si es necesario, agréguelo usted mismo.