मैं आरएसएस वस्तुओं का एक समूह लाने के लिए प्रतिक्रियाशील एक्सटेंशन के साथ प्रयोग कर रहा हूं। मैंने खुद को टिम ग्रीनफील्ड द्वारा ब्लॉग पोस्ट पर आधारित किया: Silverlight Rx DataClient within MVVM।आरएक्स पुनः प्रयास() अपेक्षित काम नहीं कर रहा है
मैं इसे डेस्कटॉप एप्लिकेशन के भीतर उपयोग कर रहा हूं, लेकिन कोड समान है।
मेरी समस्या यह है कि Retry()
फ़ंक्शंस को समझने में समस्या है। ऐसा लगता है कि मैं जो अपेक्षा करता हूं वह कर रहा हूं और जिस पर मैं इसकी अपेक्षा कर रहा हूं।
var items = new List<RssItem>();
WebHelper.DownloadXmlFileAsync<RssItem>(new Uri(URI), "item")
.Retry(2)
.Finally(PublishResults)
.Subscribe(items.Add, ProcessError,() => ProcessCompleted(items));
जब मैं एक वैध यूआरआई में जाता हूं, तो यह बिना किसी समस्या के काम करता है। जब मैं यूआरआई में एक टाइपो बना देता हूं तो यह 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
@ जेन्सेनसोमर ग्लेड मैं मदद की हो सकती है। अपनी समस्या के सटीक कारण के बारे में बहुत विशिष्ट नहीं होने के बारे में खेद है। आरएक्स लगाने पर दस्तावेज़ीकरण दुर्लभ है, और मुझे उम्मीद है कि ये सामान्य उत्तर किसी ऐसे व्यक्ति के लिए उपयोग किए जा सकते हैं जो भविष्य में आरएक्स सीखने की कोशिश कर रहा है। – Asti
यदि हर कोई आरएक्स के रूप में बाहर निकलेगा, तो मुझे यकीन है कि उचित दस्तावेज और बड़े उपयोग-मामले उदाहरण निकट भविष्य में पॉप अप होंगे। :-) – Jensen