C# WebRequest BeginGetResponse/EndGetResponse在使用Task.FromAsync时引发异常
我尝试使用WebRequest将POST操作异步化到RESTWeb服务 因此,据我所知,我需要使用C# WebRequest BeginGetResponse/EndGetResponse在使用Task.FromAsync时引发异常,c#,asynchronous,windows-phone-8,async-await,webrequest,C#,Asynchronous,Windows Phone 8,Async Await,Webrequest,我尝试使用WebRequest将POST操作异步化到RESTWeb服务 因此,据我所知,我需要使用Task.Factory.fromsync(BeginXyz,EndXyz,null),它似乎适用于GetRequestStream对方法,因为我没有得到任何异常,字节[]充满了值 Stream requestStream = await Task.Factory.FromAsync<Stream>( request.BeginGetReq
Task.Factory.fromsync(BeginXyz,EndXyz,null)
,它似乎适用于GetRequestStream
对方法,因为我没有得到任何异常,字节[]充满了值
Stream requestStream = await Task.Factory.FromAsync<Stream>(
request.BeginGetRequestStream, request.EndGetRequestStream, null);
byte[] postBytes = Encoding.UTF8.GetBytes(requestData);
await requestStream.WriteAsync(postBytes, 0, postBytes.Length);
Stream requestStream=wait Task.Factory.fromsync(
request.BeginGetRequestStream,request.EndGetRequestStream,null);
byte[]postBytes=Encoding.UTF8.GetBytes(requestData);
wait requestStream.WriteAsync(postBytes,0,postBytes.Length);
很好,上面的代码正在运行,下一部分抛出异常
WebResponse webResponse = await Task.Factory.FromAsync<WebResponse>(
request.BeginGetResponse, request.EndGetResponse, null);
WebResponse WebResponse=wait Task.Factory.fromsync(
request.BeginGetResponse,request.EndGetResponse,null);
每个请求都有例外
System.NotSupportedException:不支持指定的方法
堆栈跟踪:
位于System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback
beginMethod,对象状态)位于
System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult
asyncResult)在System.Func`2.Invoke(T arg)在
System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult
iar,Func`2 endFunction,Action`1 endAction,Task`1 promise,布尔值
要求(同步)
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()中
在
Gtas.Core.ServiceRepository.d_u8.MoveNext()
InnerException堆栈跟踪:位于
System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult
异步结果)在
System.Net.Browser.ClientHttpWebRequest.c_uuDisplayClasse.b_uud(对象
发送状态)在
System.Net.Browser.AsyncHelper.c__DisplayClass1.b__0(对象
发送国)
执行请求的完整代码如下所示:
Stream requestStream = await Task.Factory.FromAsync<Stream>(
request.BeginGetRequestStream, request.EndGetRequestStream, null);
byte[] postBytes = Encoding.UTF8.GetBytes(requestData);
await requestStream.WriteAsync(postBytes, 0, postBytes.Length);
WebResponse webResponse = await Task.Factory.FromAsync<WebResponse>(
request.BeginGetResponse, request.EndGetResponse, null);
Stream streamResponse = webResponse.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = await streamRead.ReadToEndAsync();
// ... Do something with the result data
Stream requestStream=wait Task.Factory.fromsync(
request.BeginGetRequestStream,request.EndGetRequestStream,null);
byte[]postBytes=Encoding.UTF8.GetBytes(requestData);
wait requestStream.WriteAsync(postBytes,0,postBytes.Length);
WebResponse WebResponse=wait Task.Factory.fromsync(
request.BeginGetResponse,request.EndGetResponse,null);
streamResponse=webResponse.GetResponseStream();
StreamReader streamRead=新的StreamReader(streamResponse);
string responseString=等待streamRead.ReadToEndAsync();
// ... 对结果数据做些什么
我不太明白错误是什么
我从stackoverflow和一些MSDN帖子中尝试了几个实现。似乎什么都不管用
使用回调可以很好地工作。但很高兴知道为什么我不能让它工作
你有没有想过如何做到这一点
不确定是否存在内存泄漏,但
WebResponse response = null;
using (var stream = await
Task<Stream>.Factory.FromAsync(request.BeginGetResponse, result =>
{
response = request.EndGetResponse(result);
return response.GetResponseStream();
}, request))
{
// TODO
}
response.Dispose();
WebResponse=null;
使用(var stream=wait)
Task.Factory.fromsync(request.BeginGetResponse,result=>
{
response=request.EndGetResponse(结果);
返回response.GetResponseStream();
}(请求)
{
//待办事项
}
response.Dispose();
为什么您不使用像HttpClient这样支持异步/等待开箱即用的东西?您好,这会救我的命,但因为这是一个要分发的库,所以我不能使用第三方库,这意味着最终用户将需要两个库。至少在我的情况下,依赖性是不好的!这意味着HttpClient只能通过NuGet获得。NotSupportedException
似乎表明Xamarin的支持中缺少了一些东西。你问过他们吗?(Async仍在那里预发布)。Stephen:)您已经注意到Xamarin这个词,说实话,是的,我使用Xamarin项目中的共享代码,但实现是针对Windows Phone 8的,对此很抱歉,我只使用相同的名称空间。@George Taskos,我正在使用Xamarin.Forms在VS premium 2013中为WP runtime开发。在我的PCL项目中,我也得到了与您在上面给出的相同的异常。它适用于Android和iOS。如何修复它?如果你能把你的答案贴在这里会很有帮助。