"> "> " />

Rx + WebRequest + XDocument.Loadを使用して変更した場合のみXDocumentを取得する

私は以下の2つの観測値を持っています

System.Net.WebRequest req = System.Net.HttpWebRequest.Create("http://test.com/data.xml"); req.Method = "HEAD";

var ob = Observable.FromAsyncPattern(req.BeginGetResponse、req.EndGetResponse);

ob().Select(x => x).Select(x => x.Headers["Last-Modified"]).DistinctUntilChanged(x => x);

Observable .Interval(TimeSpan.FromSeconds(1.0)) .Select(_ => XDocument.Load("http://test.com/data.xml"));

私は、XDocument observableは、 "last-modified"ヘッダが以前に要求されたドキュメントよりも大きい場合にのみ実行されることを望みますか?

1

1 答え

Firstly .Select(x=>x) is a no-op so you can remove that.

私は少しコードを変更するだろう。最初に、それを構成部分に分割することができます。

1)タイマー。毎秒、サーバーをポーリングします。

var poll = Observable.Interval(TimeSpan.FromSeconds(1));

2)ヘッダーを取得する呼び出し

var lastModified = Observable.FromAsyncPattern(req.BeginGetResponse, req.EndGetResponse).Select(x => x.Headers["Last-Modified"]);

3)ドキュメントを取得するための選択

.Select(_ => XDocument.Load("http://test.com/data.xml"));

我々はそれをうまく構成することができるはずです:

var lastModified = from interval in Observable.Interval(TimeSpan.FromSeconds(1))
           from response in Observable.FromAsyncPattern(req.BeginGetResponse, req.EndGetResponse)
           select response.Headers["Last-Modified"];

var data = lastModified.DistinctUntilChanged().Select(_ => XDocument.Load("http://test.com/data.xml"));

data.Subscribe(dataXml=> 
   {
       Console.WriteLine("Data has changed!");
       Console.WriteLine(datXml);
   });

Cavet私はちょうどそれをブラウザに直接入力しました。私はそれがコンパイルされたら驚くだろう。

1
追加された