技術的な記事を自分で書いたばかりなので、アドバイスをお願いします。ははは。
オリジナルの記事: http://bbs.5inet.net/topic.aspx?topicid=181
Web ページ上のフォーラム情報を読み取る必要がある場合があります。従来の ASP では、これら 2 つの方法は使用されません。非常に便利ですが、検索エンジンには優しくありません。 .Net を使用すると、別の方法が得られます。
要件: フォーラムは RSS サポートを提供する必要があります。
コードは次のとおりです。
#region タスククラス
//これは特定のタスクを実行するタスククラスです
パブリック クラス RssAsyncTask
{
プライベート文字列_rssContent;
プライベート AsyncTaskDelegate _dlgt;
プライベート文字列 rssUrl;
プライベートブール_成功;
パブリックブールIsSuccess;
{
得る
{
_成功を返す;
}
public RssAsyncTask(string rssUrl
)
{
this.rssUrl = rssUrl;
}
// デリゲートを作成します。
保護されたデリゲート void AsyncTaskDelegate()
;
{
_rssContent を返す;
}
public void DoTheAsyncTask()
{
// 遅延をシミュレートするために人為的な遅延を導入します。
// これを非同期タスクより大きくします。
// AsyncTimeout プロパティ。
WebClient wc = new WebClient();
試す
{
_rssContent = wc.DownloadString(rssUrl);
_成功 = true;
}
catch (例外 e)
{
_rssContent = e.メッセージ;
}
ついに
{
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(ar);
}
// タスクが実行された場合に呼び出されるメソッドを定義します。
// 非同期タイムアウト期間内に完了しませんでした。
public void OnTimeout(IAsyncResult ar)
{
_rssContent = "非同期タスクを完了できませんでした " +
"AsyncTimeout パラメーターを超えたためです。";
}
}
#endregion
//カスタム コントロールは別のカスタム コントロールを継承します。
パブリッククラスR記事
: Lパネル
{
#地域のプロパティ
文字列 rssUrl;
パブリック文字列 RssUrl
{
取得 { RSSURL を返す }
セット { rssUrl = 値 }
int
maxRecordNumber = 6
;
{
get { 最大レコード番号を返す }
セット { maxRecordNumber = 値 }
}
#endregion
RssAsyncTask タスク;
protected オーバーライド void OnInit(EventArgs e)
{
Base.OnInit(e);
タスク = 新しい RssAsyncTask(this.rssUrl);
PageAsyncTask asyncTask = new PageAsyncTask(task.OnBegin, task.OnEnd, task.OnTimeout, null)
;
Page.ExecuteRegisteredAsyncTasks();
ランダム
r = 新しいランダム();
protected オーバーライド void Render(System.Web.UI.HtmlTextWriter ライター)
{
文字列 rssContent = task.GetRssContent();
XmlDocument ドキュメント = null;
if (タスク.IsSuccess)
{
doc = 新しい XmlDocument();
doc.LoadXml(rssContent);
this.Title = doc.SelectSingleNode("rss/チャンネル/タイトル").InnerText;
this.TitleNavigateUrl = doc.SelectSingleNode("rss/channel/link").InnerText;
this.ShowTitle = true;
}
Base.RenderBegin(ライター)
;
Writer.WriteAttribute("クラス", "child2");
右(筆者);
Writer.WriteBeginTag("ul");
Right(ライター);
if (doc != null)
{
#region success
XmlNodeList items = doc.SelectNodes("rss/channel/item");
List<XmlNode> ノード = new List<XmlNode>();
foreach (項目内の XmlNode ノード)
nodes.Add(node);
//ジェネリックを使用して日付を逆順に並べ替えます
nodes.Sort(new Comparison<XmlNode>(delegate(XmlNode n1, XmlNode n2)
{
DateTime d1 = DateTime.Parse(n1.SelectSingleNode("pubDate").InnerText);
DateTime d2 = DateTime.Parse(n2.SelectSingleNode("pubDate").InnerText);
タイムスパン ts = d2 - d1;
戻り値 (int)ts.TotalSeconds;
}));
for (int i = 0; i < maxRecordNumber; i++)
{
XmlNode ノード = ノード[i];
Writer.WriteBeginTag("li");
右(筆者);
Writer.WriteBeginTag("a");
Writer.WriteAttribute("ターゲット", "_blank");
Writer.WriteAttribute("href", Node.SelectSingleNode("link").InnerText);
右(筆者);
Writer.Write(node.SelectSingleNode("title").InnerText);
Writer.WriteEndTag("a");
Writer.WriteEndTag("li");
#エンド
リージョン
}
それ以外
{
Writer.WriteBeginTag("pre");
右(筆者);
Writer.Write(task.GetRssContent());
Writer.WriteEndTag("pre");
Writer.WriteEndTag
("ul");
(
"div")
;
}
}
使用方法:
1. レジストレーション制御
<%@ 登録アセンブリ="Controls" 名前空間="Limited.Controls" TagPrefix="lm" %>
2. 電話をかける
<lm:RArticle ID="RArticle1" runat="server" MaxRecordNumber="10" RssUrl=" http://bbs.5inet.net/rss.aspx " />
わかりやすくするために、このプログラムではキャッシュなどの技術は使用しません。必要に応じて、自分で追加してください。