少し前に、中国ブロググループ ( http://www.bokequn.cn ) というブログプロモーション Web サイトを構築しました。そこには、ブログの記事情報を定期的にデータベースに読み込んでユーザーに表示する機能があります。仮想ホストなので、サーバー側のタイマーを使用して解決することしか考えていませんでした。
当時、私は急いでいて最適化する時間がなく、私のレベルは非常に限られていました。何かが間違っている、またはそれを解決するより良い方法があると思われる場合は、お気軽に教えてください。
プロセス全体で重要なポイントは 2 つあると思います:
タイマーをどう扱うか
RSSの閲覧をモジュール化して呼び出しやすくする
1. タイマーに関しては、もちろん Global.asax に記述されています。まず変数を作成します。
System.Timers.Timer t=new System.Timers.Timer(1000*Convert.ToInt16(System.Configuration.ConfigurationSettings.AppSettings["do_time) " ]));
このうち do_time は、web.config で実行頻度にアクセスするために使用され、
Application_Start で処理されます
。
t.有効=true;
if(common.func.get_key("can_do")=="1")//通常の処理を実行するかどうかも web.config でアクセスされます。common.func.get_key は設定を取得するためのカスタム関数です
t.Elapsed +=new System.Timers.ElapsedEventHandler(fun);
関数 fun のコード:
private void fun(オブジェクト送信者、System.Timers.ElapsedEventArgs e)
{
試す
{
System.DateTime dt=System.DateTime.Now;
common.func.write_log("リモート XML の読み取りを開始");//ログの書き込み
rss2sql rl=new rss2sql();
rl.readall();
System.DateTime dt2=System.DateTime.Now;
common.func.write_log("XML ファイルがデータベースに正常にインポートされました"+Convert.ToString(dt2-dt));//この実行時間をログに書き込みます、
}
catch(例外例)
{
common.func.write_log("リモート XML ファイルの読み取りエラー:"+ex.Message);// ログを書き込む
}
}
Global.asax のコードは完成です。
2. 次のステップでは、rss2sql クラスのデータベースから RSS リストを取得し、最後に読み取られた RSS 時刻と RSS ファイルの変更時刻に基づいて RSS ファイルを読み取り、それを次のファイルに書き込みます。カスタマイズされたクラスとメソッドが多すぎるため、すべてのコードはリストされていません。その中で、より重要な関数は最後にダウンロードできます
。
/// データベースへの指定されたリンクの RSS コンテンツを読み取ります
/// </概要>
/// <param name="id">対応するブログの ID</param>
/// <param name="url">RSS アドレス</param>
/// <param name="dt">最終読み取り時刻</param>
public void read_from_url(string id,string url,System.DateTime dt)
{
op_db.db_class db1=新しい op_db.db_class();
試す
{
rssFeed feed = new rssFeed(url,dt);//RSS読み取りクラスのインスタンスを作成する
feed.read();//読み取りを開始する
if(feed.Channel.Items.Count>0)//記事の数が 0 より大きい場合、データベースへの読み取りを開始します
{
for(int i=0;i<feed.Channel.Items.Count;i++)
{
write_artical(id,feed.Channel.Items[i].title,feed.Channel.Items[i].link,feed.Channel.Items[i].description,feed.Channel.Items[i].pubDate);
}
db1.sql="update bokequn set last_rss_date='"+feed.lastModified.ToString()+"' where id="+id;
db1.executesql();
}
}
catch(例外例)
{
common.func.write_log(id+":url:"+url+"エラー"+ex.Message+ex.Source+ex.StackTrace);
}
ついに
{
db1.db_close()
;
}
このうち、rssFeed は RSS を処理するために私が作成したクラスで、以前はオープンソースの rss.net を使用していましたが、実際の処理ではさまざまな RSS アドレスが存在します。多くの問題があり、ソースコードを見てみると、対処したいことが多すぎて、コードの量も非常に多かったです。レベルなので、しばらく修正できないと予想したので、大したことではありませんが、コントロールはいくつかのカテゴリにすぎません。もちろん、私が扱うコンテンツは比較的単純です。 . RSSのタイトルと紹介文、項目のタイトル、紹介文、時間、リンクのみを扱います。
たくさんのコードが掲載されていますので、興味のある方は最後にダウンロードしてください。
使い方は非常に簡単で、コンパイルされた dll を参照して次のように使用します
。 RSS読み取りクラスのインスタンス
feed.read();//読み取りを開始する
フィード.チャンネル.タイトル
フィード.チャンネル.説明
feed.Channel.Items.Count
feed.Channel.Items[i].title
feed.Channel.Items[i].description
feed.Channel.Items[i].link
feed.Channel.Items[i].pubDate
の dt は
、クラス内で RSS ファイルの変更時刻が取得されるため、最終読み取り時刻を表します。最終読み取り時刻より大きい場合は、それが読み取られます。そうしないと処理されません。これは、RSS の読み取りにまだ問題があることが
一目でわかると思います
(もちろん、これは考えられませんが)。読めません 解決方法をご存知の方がいらっしゃいましたら、教えて下さい。
少しわかりにくいですが、この機能を必要とする友人の役に立てば幸いです。
関連ダウンロード: http://guanvee.cnblogs.com/archive/2006/06/17/428329.html