Reactive Extensions를 사용하여 RSS 항목을 가져 오는 실험을하고 있습니다. Tim Greenfield의 블로그 게시물을 기반으로합니다 : 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 오류가보고되지만 예상 한대로 오류는 한 번만보고됩니다. 나는 그것이이 오류를 두 번 나타낼 것으로 예상했을 것이다.
내 웹 요청에서 Retry()
기능이 작동하지 않는 것 같지만 실제로는 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