2013-11-27 10 views
6

Iobservableを返す単純なWeb APIがあります。私はそれを購読することができるようにObservableを取得するためにHttpClientを使用しています。私の問題は、サブスクリプションで返されたIobservableが「空の」結果を送信することです。Web APIから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) 
     }); 
} 

CLIENT

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はあなたのためにそれをしません。

あなたが見ているのは、デフォルトのjsonシリアライザがIObservable<T>のプロパティを出力した結果であり、何もないので空の中かっこが表示されます。

ユニットテストはすべてメモリ内にあり、シリアル化/デシリアライゼーションは起こっていないため、動作します。

は結果をストリーミングするHttpResponseMessageのStreamContentプロパティを使用する方法がありますされて、あなたでし橋へ/ IObservable<T>から - しかし、それは本当に慣用WEBAPIではありません。 WebApiの非同期サポートは、ストリーミングイベントを継続的に返すのではなく、サーバ上の単一項目の応答を持つリクエストの非同期処理を実際に目的としています。

結論私はWebApi(少なくとも書面では)は間違った技術選択だと考えています。あなたはこの種のシナリオのために作られたSignalRを見ているほうがはるかに優れており、現在のASP.NETのリリースに含まれています。これにはjavascriptと.NETクライアントの両方のサポートがあり、かなり簡単にIObservable<T>にブリッジできます。 in this post sporting example codeのように、これをすでに見ている人もいます。

私-チャンネルNirvanaのようないくつかのメッセージング・ミドルウェア:SQL ServerのStreamInsightのような(編集。テラコッタによって購入し一部example codeが自分のドキュメントに利用可能であるユニバーサル・メッセージングに包まれているため)、およびCEPソリューションは、ボックスIObservableサポートの外に持っていますあまりにも。

+0

Nirvanaリンクのリンク腐敗を修正しました。テラコッタがそれを買った。 –

+0

ニルヴァーナのリンクが機能していません。 –

+0

私はそれを更新し、サンプルへのリンクを追加しました。 –

関連する問題