1

У меня есть следующие два наблюдаемымиПолучение XDocument только при использовании модифицированного Rx + WebRequest + XDocument.Load

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 наблюдаемая только выполняется, когда «последнего изменения» заголовок чем ранее запрошенный документ какие-либо идеи?

ответ

1

Во-первых. Выберите (x => x), это не-op, чтобы вы могли его удалить.

Я бы немного изменил код. Сначала давайте разложим его на составляющие его части:

1) Таймер. Каждый второй опрос сервера.

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

2) Вызов, чтобы получить заголовок

вар LastModified = Observable.FromAsyncPattern (req.BeginGetResponse, req.EndGetResponse) .Select (х => 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 Я только что напечатали, что прямо в браузере. Я бы удивился, если он скомпилируется.