gpt4 book ai didi

c# - 在 Windows Phone 7 上创建 WebRequestFactory

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:36 25 4
gpt4 key购买 nike

我正在尝试创建一个基于 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 数据事件的发送与服务器响应的检索联系起来。

这是我第一次使用异步 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;
}

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

最佳答案

你是对的,错误处理是通过发送 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)()
}

关于c# - 在 Windows Phone 7 上创建 WebRequestFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6081770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com