Я сам только что написал техническую статью, пожалуйста, дайте мне ваш совет. Ха-ха.
Исходная оригинальная статья: http://bbs.5inet.net/topic.aspx?topicid=181
Иногда нам нужно прочитать информацию форума на веб-странице. В традиционном ASP мы используем JS или IFRAME. Эти два метода не используются. очень удобно и недружелюбно к поисковым системам. Теперь с .Net у нас есть другой путь.
Требования: Форум должен обеспечить поддержку RSS.
Код выглядит следующим образом:
#класс задач региона
//Это класс задач, выполняющий конкретные задачи
публичный класс RssAsyncTask
{
частная строка _rssContent;
частный AsyncTaskDelegate _dlgt;
частная строка rssUrl;
частный bool _success
общественный bool IsSuccess
;
{
получать
{
вернуть _успех;
}
}
Public RssAsyncTask (строка rssUrl)
{
this.rssUrl = rssUrl;
}
// Создаем делегата.
защищенный делегат void AsyncTaskDelegate();
public String GetRssContent();
{
вернуть _rssContent;
}
общественная недействительность DoTheAsyncTask()
{
// Вводим искусственную задержку для имитации задержки
// асинхронная задача.
// Свойство AsyncTimeout.
WebClient wc = новый WebClient();
пытаться
{
_rssContent = wc.DownloadString(rssUrl);
_успех = правда;
}
поймать (Исключение e)
{
_rssContent = e.Message;
}
окончательно
{
wc.Dispose();
}
//Thread.Sleep(TimeSpan.FromSeconds(5.0));
}
// Определить метод, который будет вызываться
// запускаем асинхронную задачу.
public IAsyncResult OnBegin (отправитель объекта, EventArgs e,
AsyncCallback cb, объект extraData)
{
//_rssContent = "Начало асинхронной задачи.";
_dlgt = new AsyncTaskDelegate(DoTheAsyncTask);
Результат IAsyncResult = _dlgt.BeginInvoke(cb, extraData
возвращает результат);
}
// Определить метод, который будет вызываться, когда
// асинхронная задача завершена.
public void OnEnd (IAsyncResult ar)
{
//_rssContent = "Асинхронная задача выполнена.";
_dlgt.EndInvoke(ар);
}
// Определяем метод, который будет вызываться, если задача
// не завершено в течение интервала асинхронного тайм-аута.
public void OnTimeout (IAsyncResult ar)
{
_rssContent = "Не удалось выполнить асинхронную задачу" +
"потому что превышено значение параметра AsyncTimeout.";
}
}
#endregion
//Пользовательский элемент управления наследуется от другого пользовательского элемента управления.
публичный класс RArticle
: LPanel
{
#свойства региона
строка rssUrl
общедоступная строка RssUrl;
{
получить {вернуть rssUrl;
установить {rssUrl = значение};
}
int maxRecordNumber = 6;
общественный int MaxRecordNumber;
{
получить {вернуть maxRecordNumber;
установить {maxRecordNumber = значение};
}
Задача
#endregion
RssAsyncTask;
защищенное переопределение void OnInit (EventArgs e)
{
base.OnInit(е);
задача = новый RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = новый PageAsyncTask(task.OnBegin, Task.OnEnd, Task.OnTimeout, null);
Page.RegisterAsyncTask(asyncTask);
Page.ExecuteRegisteredAsyncTasks();
}
Статический случайный г = новый случайный ();
защищенное переопределение void Render (писатель System.Web.UI.HtmlTextWriter)
{
строка rssContent = Task.GetRssContent();
XmlDocument документ = ноль;
если (задача.IsSuccess)
{
документ = новый XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/channel/title").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = правда;
}
base.RenderBegin(писатель.WriteBeginTag
("div");
Writer.WriteAttribute("класс", "ребенок2");
Правильно (писатель);
Writer.WriteBeginTag("ul");
Правильно (писатель);
если (док! = ноль)
{
#region Success
XmlNodeList items = doc.SelectNodes("rss/channel/item");
Узлы List<XmlNode> = новый List<XmlNode>();
foreach (узел XmlNode в элементах)
nodes.Add(node);
//Используем дженерики для сортировки дат в обратном порядке
nodes.Sort(new Comparison<XmlNode>(делегат(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 = узлы [i];
писатель.WriteBeginTag("ли");
Правильно (писатель);
писатель.WriteBeginTag("а");
Writer.WriteAttribute("цель", "_blank");
Writer.WriteAttribute("href", node.SelectSingleNode("link").InnerText);
Правильно (писатель);
Writer.Write(node.SelectSingleNode("title").InnerText);
Writer.WriteEndTag("а");
писатель.WriteEndTag("ли");
}
#конечныйрегион
}
еще
{
писатель.WriteBeginTag("предварительно");
Правильно (писатель);
писатель.Запись(задача.GetRssContent());
писатель.WriteEndTag("предварительно");
}
Writer.WriteEndTag("ul");
Writer.WriteEndTag("div");
RenderChildren(писатель
);
}
}
Как использовать:
1. Регистрационный контроль
<%@ Register Assembly="Controls" Namespace="Limited.Controls" TagPrefix="lm" %>
2. Позвонить
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
Для простоты эта программа не использует такие технологии, как кэширование. При необходимости добавьте их самостоятельно.