Acabei de escrever um artigo técnico, por favor, me dê seu conselho. Ha ha.
Artigo original original: http://bbs.5inet.net/topic.aspx?topicid=181
Às vezes precisamos ler informações do fórum na página da web. No ASP tradicional, usamos JS ou IFRAME. muito conveniente e pouco amigável para os mecanismos de pesquisa. Agora com .Net temos outro caminho.
Requisitos: O fórum precisa fornecer suporte RSS.
O código é o seguinte:
#região classe de tarefa
//Esta é uma classe de tarefa que executa tarefas específicas
classe pública RssAsyncTask
{
string privada _rssContent;
private AsyncTaskDelegate _dlgt;
string privada rssUrl;
privado bool _sucesso;
público bool IsSuccess
{
pegar
{
retornar _sucesso;
}
}
public RssAsyncTask(string rssUrl)
{
this.rssUrl = rssUrl;
}
// Cria delegado.
delegado protegido void AsyncTaskDelegate();
public String GetRssContent();
{
retornar _rssConteúdo;
}
público vazio DoTheAsyncTask()
{
// Introduzir um atraso artificial para simular um atraso
// tarefa assíncrona Torne isso maior que o.
// Propriedade AsyncTimeout.
Cliente Web wc = new Cliente Web();
tentar
{
_rssContent = wc.DownloadString(rssUrl);
_sucesso = verdadeiro;
}
pegar (Exceção e)
{
_rssContent = e.Message;
}
finalmente
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Define o método que será chamado
//inicia a tarefa assíncrona.
public IAsyncResult OnBegin(objeto remetente, EventArgs e,
AsyncCallback cb, objeto extraData)
{
//_rssContent = "Iniciando tarefa assíncrona.";
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
Resultado IAsyncResult = _dlgt.BeginInvoke(cb, extraData
resultado de retorno);
}
// Define o método que será chamado quando
// a tarefa assíncrona é finalizada.
público void OnEnd (IAsyncResult ar)
{
//_rssContent = "Tarefa assíncrona concluída.";
_dlgt.EndInvoke(ar);
}
// Define o método que será chamado se a tarefa
// não é concluído dentro do intervalo de tempo limite assíncrono.
público void OnTimeout (IAsyncResult ar)
{
_rssContent = "Falha na conclusão da tarefa ansíncrona" +
"porque excedeu o parâmetro AsyncTimeout.";
}
}
#endregion
//Um controle personalizado herda de outro controle personalizado.
classe pública RArticle
: Painel L
{
#propriedades da região
string rssUrl;
string pública RssUrl
{
obter {retornar rssUrl};
definir {rssUrl = valor};
}
int maxRecordNumber = 6;
public int MaxRecordNumber
{
obter { return maxRecordNumber };
definir { maxRecordNumber = valor };
}
#endregion
tarefa RssAsyncTask;
substituição protegida void OnInit (EventArgs e)
{
base.OnInit(e);
tarefa = novo RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null)
;
Page.ExecuteRegisteredAsyncTasks();
}
static Random r = new Random();
substituição protegida void Render (escritor System.Web.UI.HtmlTextWriter)
{
string rssContent = task.GetRssContent();
documento XmlDocument = null;
if (tarefa.IsSuccess)
{
doc = new XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/canal/título").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/canal/link").InnerText;
this.ShowTitle = verdadeiro;
}
base.RenderBegin(escritor.WriteBeginTag
("div");
escritor.WriteAttribute("classe", "criança2");
Certo(escritor);
escritor.WriteBeginTag("ul");
Certo(escritor);
if (doc != null)
{
#region sucesso
XmlNodeList itens = doc.SelectNodes("rss/canal/item");
Lista<XmlNode> nós = new List<XmlNode>();
foreach (nó XmlNode em itens)
nós.Add(node);
//Use genéricos para classificar datas na ordem inversa
nós.Sort(nova comparação<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++)
{
Nó XmlNode = nós[i];
escritor.WriteBeginTag("li");
Certo(escritor);
escritor.WriteBeginTag("a");
escritor.WriteAttribute("destino", "_blank");
escritor.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Certo(escritor);
escritor.Write(node.SelectSingleNode("título").InnerText);
escritor.WriteEndTag("a");
escritor.WriteEndTag("li");
}
#endregion
}
outro
{
escritor.WriteBeginTag("pré");
Certo(escritor);
escritor.Write(task.GetRssContent());
escritor.WriteEndTag("pré");
}
escritor.WriteEndTag("ul");
escritor.WriteEndTag("div"
)
;
}
}
Como usar:
1. Controle de registro
<%@ Registrar Assembly="Controles" Namespace="Limited.Controls" TagPrefix="lm" %>
2. Ligue
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
Por uma questão de simplicidade, este programa não utiliza tecnologias como cache. Se necessário, adicione você mesmo.