【问题标题】:Creating a WebRequestFactory on Windows Phone 7在 Windows Phone 7 上创建 WebRequestFactory
【发布时间】:2011-05-22 12:17:47
【问题描述】:

我正在尝试创建一个基于 Rx 的 WebRequestFactory 来使用任何通用 API。

我有一个基本的 GET 请求半排序

public static IObservable<T> GetData<T>(Uri uri, Func<string, T> generator)
{
    System.Diagnostics.Debug.WriteLine(uri);
    return (from request in Observable.Return(CreateWebRequest(uri))
            from response in Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)()
            select generator(new StreamReader(response.GetResponseStream()).ReadToEnd())).ObserveOnDispatcher();
}

private static WebRequest CreateWebRequest(Uri uri)
{
    var ret = (HttpWebRequest)WebRequest.Create(uri);
    ret.AllowReadStreamBuffering = false;
    return ret;
}

哪个效果很好,但我不确定 Rx 中的异常处理是如何完成的,是否仅在 Subscribe() 方法中完成? IE。 Subscribe(onNext: response => handleResponse(response), onError: error => handleError(error) 或者我能早点发现吗?

我也很难获得 GetData 的 POST 版本,我目前有:

public static IObservable<T> PostData<T>(Uri uri, Func<string, T> generator, String postData)
{
    System.Diagnostics.Debug.WriteLine(uri);
    byte[] buffer = Encoding.UTF8.GetBytes(postData);

    var request = CreatePOSTWebRequest(uri);

    var obs1 = Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)();

    return null;
}

private static WebRequest CreatePOSTWebRequest(Uri uri)
{
    var ret = (HttpWebRequest)WebRequest.Create(uri);
    ret.Method = "POST";
    ret.AllowReadStreamBuffering = false;
    return ret;
}

但我不知道如何连接 POST 数据事件的发送以及服务器响应的检索。

这是我第一次使用 Async HTTPRequests,非常感谢任何帮助

编辑:(我希望这是添加到我的问题的堆栈溢出推荐方法)

我想我已经通过使用 WebClient 解决了这个问题:

public static IObservable<T> PostData<T>(Uri uri, Func<string, T> generator, String postData)
{
    System.Diagnostics.Debug.WriteLine(uri);
    WebClient wc = CreatePostWebClient(uri, postData);
    return (from e in Observable.FromEvent<UploadStringCompletedEventArgs>(wc, "UploadStringCompleted")
            select generator(e.EventArgs.Result)).ObserveOnDispatcher();

}

public static WebClient CreatePostWebClient(Uri uri, string postData)
{
    var wc = new WebClient();
    wc.AllowReadStreamBuffering = false;
    wc.UploadStringAsync(uri, postData);
    return wc;
}

但我有点担心它给我的竞争条件氛围,因为我在观察响应之前开始上传。

【问题讨论】:

    标签: c# windows-phone-7 httpwebrequest system.reactive factory-pattern


    【解决方案1】:

    您是对的,错误处理是通过向管道发送OnError 消息并从源退订来完成的。有一些运算符可以改变这种行为,比如Catch,它可以提供一个新的序列来代替(例如,使用Observable.Return返回一个默认值)。

    就发布数据而言,它应该不会太难,除非您计划实际异步缓冲请求数据以免阻塞客户端(在这种情况下,它会变得更加复杂)。只要它只是发布数据,它应该是这样的:

    return (from request in Observable.Return(CreateWebRequest(uri))
            from requestStream in Observable.FromAsyncPattern<WebResponse>(
                                      request.BeginGetRequest, request.EndGetRequest)()
            from response in PostAndGetResponse(request, requestStream)
            select generator(new StreamReader(response.GetResponseStream()).ReadToEnd())
           ).ObserveOnDispatcher();
    
    private IObservable<WebResponse> PostAndGetResponse(
        WebRequest request, Stream requestStream)
    {
        // Write data to requestStream
    
        return Observable.FromAsyncPattern<WebResponse>(
            request.BeginGetResponse, request.EndGetResponse)()
    }
    

    【讨论】:

    • 谢谢@Richard,给了我更多的思考,因为最好我想异步地做这一切,也许使用WebClient?
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多