2011-09-14 10 views
3

SLアプリケーションでRxを使用したいと思います。私は私のウェブサーバーへのREST要求に観測可能なものを設定したいと思っています。私はObservable.FromEventまたはObservable.FromAsyncをワイヤリングする方法を見ていません。私の最高の推測では、Webclientの完了がイベントを発生させ、Observable.FromEventを実行することです。そこには良い方法がありますか?Silverlight WebclientでRx Observableを実行する方法

+0

+1私はいくつかのいずれかのように見えるが、何を証明してもらいたい;) – AnthonyWJones

答えて

3

これは、RxでWebリクエストを行うための最良の方法です。

public IObservable<WebResponse> MakeWebRequest(
     Uri uri, 
     Dictionary<string, string> headers = null, 
     string content = null, 
     int retries = 3, 
     TimeSpan? timeout = null) 
{ 
    var request = Observable.Defer(() => 
    { 
     var hwr = WebRequest.Create(uri); 
     if (headers != null) 
     { 
      headers.ForEach(x => hwr.Headers[x.Key] = x.Value); 
     } 

     if (content == null) 
     { 
      return Observable.FromAsyncPattern<WebResponse>(hwr.BeginGetResponse, hwr.EndGetResponse)(); 
     } 

     var buf = Encoding.UTF8.GetBytes(content); 
     return Observable.FromAsyncPattern<Stream>(hwr.BeginGetRequestStream, hwr.EndGetRequestStream)() 
      .SelectMany(x => Observable.FromAsyncPattern<byte[], int, int>(x.BeginWrite, x.EndWrite)(buf, 0, buf.Length)) 
      .SelectMany(_ => Observable.FromAsyncPattern<WebResponse>(hwr.BeginGetResponse, hwr.EndGetResponse)()); 
    }); 

    return request.Timeout(timeout ?? TimeSpan.FromSeconds(15)).Retry(retries); 
} 

は、ここでそれを使用する方法は次のとおりです。

MakeWebRequest(new Uri("http://www.google.com")) 
    .Subscribe(
     x => Console.WriteLine("Response is {0}", x), 
     ex => Console.WriteLine("Someone Set Us Up The Bomb: {0}", ex.Message)); 
+0

ザッツを吸収するためにいくつかの時間を取るつもり! – pm100

+0

実装について心配する必要はなく、Webリクエストを作成するために情報を渡していることを知っていれば、最終的に1つのアイテム(応答)を返すIObservable が得られます。この場合、IObservable は、 "Future"のようなものです。

+0

エラー処理を含む使用例コードも含めることができますか? – AnthonyWJones