2011-09-14 31 views
3

我想在我的SL应用程序中使用Rx。我想在我的Web服务器的REST请求上设置一个observable。我没有看到如何连接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请求,并且您将获得一个IObservable ,最终将返回一个项目(响应)。在这种情况下,IObservable 代表“Future”,类似于任务

+0

您是否还可以包含示例使用代码,包括错误处理? – AnthonyWJones

相关问题