【发布时间】: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