Reactive Extensionsを試していて、RSSアイテムをたくさん取得しています。ティム・グリーンフィールドのブログ記事:Silverlight Rx DataClient within MVVMに基づいています。Rx再試行()が正常に動作しない
私はデスクトップアプリケーション内で使用していますが、コードは似ています。
私が抱えている問題は、Retry()
の機能を理解することです。それは私が期待していることをやっているとは思わないし、私が期待していることにもあるようだ。
var items = new List<RssItem>();
WebHelper.DownloadXmlFileAsync<RssItem>(new Uri(URI), "item")
.Retry(2)
.Finally(PublishResults)
.Subscribe(items.Add, ProcessError,() => ProcessCompleted(items));
有効なURIを渡すと、問題なく動作します。私がURIにタイプミスをすると、ProcessError()
関数を介して404エラーが報告されますが、それは一度だけ報告されます。私はこのエラーを2回表示することを期待していました。
したがって、Retry()
機能は私のWebリクエストでは動作していないようですが、実際にはSubscribe()
に渡される機能に適用されるようです。私はここで間違っている可能性があります。
Retry()
コールがウェブリクエストに適用されることを確認するにはどうすればよいですか?
エクストラコード:
public static class WebHelper
{
public static HttpWebRequest CreateHttp(Uri uri)
{
return CreateHttp(uri, "GET");
}
public static HttpWebRequest CreateHttp(Uri uri, string method)
{
if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps)
{
throw new ArgumentException("The specified URI does not use HTTP or HTTPS.", "uri");
}
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = method;
return request;
}
public static IObservable<T> DownloadXmlFileAsync<T>(Uri uri, string elementName) where T : class
{
return (from request in Observable.Return(CreateHttp(uri))
from response in Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)()
let stream = response.GetResponseStream()
where stream != null
from item in XmlReader.Create(stream).GetXmlItem<T>(elementName).ToObservable()
select item);
}
}
public static class XmlExtensions
{
public static IEnumerable<T> GetXmlItem<T>(this XmlReader reader, string elementName) where T : class
{
var serializer = new XmlSerializer(typeof (T));
while (reader.GoToElement(elementName))
{
yield return serializer.Deserialize(reader) as T;
}
}
public static bool GoToElement(this XmlReader reader, string elementName)
{
do
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == elementName)
{
return true;
}
} while (reader.Read());
return false;
}
}
XmlRoot("item")]
public class RssItem
{
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("link")]
public string Link { get; set; }
[XmlElement("pubDate")]
public string PublishDate { get; set; }
[XmlElement("title")]
public string Title { get; set; }
public override string ToString()
{
return string.Format("Title: {0}", Title);
}
}
あなたの答えは、いくつかの良い洞察を提供し、また、特定のキーワードでインターネットを検索することもできました。http://social.msdn.microsoft.com/Forums/da-DK/rx/thread/96a06e27-9c02-4177 -ae6a-04b8a7f966e5は、観察可能な方法でもう少し洞察を与えました。 – Jensen
@JensenSomersうれしい私は助けになることができます。申し訳ありませんが、あなたの問題の正確な原因について非常に具体的ではありません。 Rxを適用するためのドキュメントはまれであり、これらの一般的な回答が今後Rxを学びたいと思っている人にとっては役に立つと思っています。 – Asti
私がそうであるように、誰もがRxについて出て行くことになっていれば、近い将来、適切なドキュメントと大きなユースケースの例がポップアップするはずです。 :-) – Jensen