WebRequest BeginGetResponse / EndGetResponse在使用Task.FromAsync时抛出异常

时间:2013-08-28 22:56:12

标签: c# asynchronous windows-phone-8 async-await webrequest

我尝试使用WebRequest将POST操作异步到REST Web服务。

所以从我已经知道的情况来看,我需要使用Task.Factory.FromAsync<T>(BeginXyz, EndXyz, null),似乎它适用于GetRequestStream对方法,因为我没有异常并且byte []充满了值。

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

我得到的每个请求都是例外。

  

System.NotSupportedException:不支持指定的方法。

     

堆栈跟踪:

     
    

在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback)     beginMethod,Object state)at     System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult的     asyncResult)在System.Func`2.Invoke(T arg)at     System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult的     iar,Func`2 endFunction,Action`1 endAction,Task`1 promise,Boolean     requiresSynchronization)     ---从抛出异常的先前位置开始的堆栈跟踪结束--- at     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务     任务)     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务     任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()     在     Gtas.Core.ServiceRepository.d__8.MoveNext()

  
     

InnerException StackTrace:at   System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的   asyncResult)at   System.Net.Browser.ClientHttpWebRequest&LT;&GT; c__DisplayClasse.b__d(对象   sendState)at   System.Net.Browser.AsyncHelper&LT;&GT; c__DisplayClass1.b__0(对象   sendState)

执行请求的完整代码应该是这样的:

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

我不太明白错误是什么。

我尝试了stackoverflow和一些MSDN帖子的几个实现。似乎没什么用。

使用回调工作正常。但很高兴知道为什么我不能让它发挥作用。

有任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

  1. 尝试使用requestStream.WriteAsync之后使用或调用requestStream.Close()来环绕requestStream
  2. 检查request.Method =“POST”;不缺。

答案 1 :(得分:0)

不确定内存泄漏但是

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