2013-11-27 17 views
6

से IObservable वापस कैसे प्राप्त करें मेरे पास एक साधारण वेब एपीआई है जो Iobservable लौटाती है। मैं पर्यवेक्षक प्राप्त करने के लिए HttpClient का उपयोग कर रहा हूं ताकि मैं इसकी सदस्यता ले सकूं। मेरी समस्या है सदस्यता पर लौटा Iobservable एक 'खाली' परिणाम भेजता है।वेब एपीआई

सर्वर

public IObservable<DataItem> GetDataItems() 
{ 
    return Observable.Generate(0, i => i < 10, i => i + 1, 
     i => new DataItem 
     { 
      Id = i, 
      Name = String.Format("Storage{0}",i) 
     }); 
} 

ग्राहक

public IObservable<DataItem> GetDataItems() 
{ 
    using (HttpClient apiClient = new HttpClient()) 
    { 
     apiClient.BaseAddress = new Uri("http://localhost:9001"); 
     apiClient.DefaultRequestHeaders.Add("x-user-authentication", "xxxxxx"); 
     return apiClient 
      .GetAsync("api/xxxx/yyyy").Result.Content 
      .ReadAsAsync<DataItem>().ToObservable(); 
    } 
} 

var source = GetDataItems(); 

List<DataItem> items = new List<DataItem>(); 

IDisposable consoleSubscription = source.Subscribe(
      x => Console.WriteLine("{0}:{1}", x.Id, x.Name), 
      ex => Console.WriteLine("OnError : {0} ", ex.Message), 
      () => Console.WriteLine("Encountered End of Stream") 
      ); 
     consoleSubscription.Dispose(); 

मेरे मुद्दा मैं किसी भी डेटा सर्वर से वापस नहीं मिल रहा है है। मुझे एक 'खाली' देखने योग्य लगता है। मैंने अपने नियंत्रक के खिलाफ एक यूनिट टेस्ट लिखा और यह डेटािटैम्स को वापस देता है।

कोई सुझाव कृपया मदद करें। यह समझने में असमर्थ कि मैं कहां गलत हो रहा हूं। सर्वर या क्लाइंट पर कोई त्रुटि नहीं है।

उत्तर

17

आप तार पर स्वचालित रूप से स्ट्रीम होने के लिए IObservable<T> की अपेक्षाकृत महत्वाकांक्षी उम्मीद कर रहे हैं। मुझे डर है WebAPI आपके लिए ऐसा नहीं करेगा।

जो आप देख रहे हैं वह IObservable<T> के गुणों को आउटपुट करने वाले डिफ़ॉल्ट जेसन सीरिएलाइज़र का परिणाम है - और कोई भी नहीं है जिससे आपको खाली ब्रेसिज़ मिलते हैं।

आपका यूनिट परीक्षण काम करता है क्योंकि यह सभी स्मृति में है - कोई क्रमबद्धता/deserialization नहीं हो रहा है।

वहाँ परिणाम स्ट्रीम करने के लिए HttpResponseMessage के StreamContent संपत्ति का उपयोग कर के तरीके हैं जो बाहर आप कर सकता करने के लिए/IObservable<T> से पुल - लेकिन यह वास्तव में मुहावरेदार WebAPI नहीं है। वेबएपी का एसिंक समर्थन वास्तव में सर्वर पर सिंगल-आइटम प्रतिक्रियाओं के साथ अनुरोधों की एसिंक्रोनस प्रोसेसिंग का लक्ष्य है, न कि लगातार स्ट्रीमिंग ईवेंट लौटने पर।

नीचे की रेखा यह है कि मुझे लगता है कि वेबएपी (कम से कम लिखने के समय) गलत तकनीक विकल्प है। आप SignalR को देखकर बहुत बेहतर हैं, जिसका उद्देश्य इस तरह के परिदृश्य के लिए बनाया गया है, और एएसपी.नेट की वर्तमान रिलीज में शामिल है। इसमें जावास्क्रिप्ट और .NET क्लाइंट समर्थन दोनों हैं, और आप IObservable<T> पर काफी आसानी से पुल कर सकते हैं। कुछ लोगों ने पहले ही इसे देखा है, जैसे in this post sporting example code

मेरी-चैनल Nirvana (संपादित करें।: के बाद से टेराकोटा से बाहर खरीदा है और यूनिवर्सल संदेश में लपेटा कुछ example code अपनी दस्तावेज़ीकरण में उपलब्ध है) जैसे कुछ मैसेजिंग मिडलवेयर, और सीईपी समाधान एसक्यूएल सर्वर StreamInsight की तरह बॉक्स IObservable समर्थन से बाहर है भी।

+0

निर्वाण लिंक पर लिंक-रॉट फिक्स्ड; टेराकोटा ने इसे खरीदा। –

+0

निर्वाण लिंक काम नहीं कर रहा है। –

+0

मैंने इसे अपडेट किया है, और नमूना के लिए एक लिंक जोड़ा है। –