如何在Silverlight Webclient中使用Rx Observable

3

我想在我的SL应用程序中使用Rx。 我希望设置一个可观察对象,以便观察 REST 请求到我的 Web 服务器。 我不知道如何连接 Observable.FromEvent 或 Observable.FromAsync。 我的最佳猜测是使 WebClient 完成并触发事件,然后执行 Observable.FromEvent。有更好的方法吗?


+1 我想看看有人演示这是什么样子的 ;) - AnthonyWJones
1个回答

3

这是使用Rx进行网络请求的最佳方法。

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));

那需要一些时间来消化! - pm100
不要担心实现细节,只需知道您正在传递信息以发起 Web 请求,并且您将获得一个 IObservable<WebResponse> ,该对象最终会返回一项(响应)。在这种情况下,IObservable<T> 表示“Future”,有点像 Task<T>。 - Ana Betts
你能否同时附带包含错误处理的使用示例代码? - AnthonyWJones
大多数Observable.Foo返回IObservable的原因是什么,但是Observable.FromAsync返回一个返回IObservable的Func? - pm100
因为它会给你一个 Func,每次调用它时都会发出一个新的请求,就像调用 BeginXXXX 一样。它将 Begin/End "翻译"成适用于 Rx 的语法。 - Ana Betts
内容参数怎么样? - Richard Anthony Freeman-Hein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接