【问题标题】:WebRequest BeginGetResponse/EndGetResponse throws exception when using Task.FromAsyncWebRequest BeginGetResponse/EndGetResponse 在使用 Task.FromAsync 时抛出异常
【发布时间】:2017-08-01 11:13:51
【问题描述】:

我尝试使用 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 开始方法,对象状态)在 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 承诺,布尔 需要同步) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Gtas.Core.ServiceRepository.d__8.MoveNext()

InnerException StackTrace:在 System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.ClientHttpWebRequest.c__DisplayClasse.b__d(对象 发送状态)在 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

我不太明白错误是什么。

我从 stackoverflow 和一些 MSDN 帖子中尝试了几种实现。似乎没有任何效果。

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

任何想法如何做到这一点?

【问题讨论】:

  • 为什么你不使用开箱即用的支持 Async/Await 的 HttpClient 之类的东西?
  • 您好,这可以挽救我的生命,但由于这是一个要分发的库,我不能使用第三方库,这意味着最终用户将需要两个库。至少在我的情况下,依赖关系很糟糕!这意味着 HttpClient 只能通过 NuGet 获得。
  • NotSupportedException 似乎表明 Xamarin 的支持缺少某些内容。你问过他们吗? (那里的异步仍然是预发布版)。
  • Stephen :) 你已经注意到 Xamarin 这个词,说实话,是的,我使用了 Xamarin 项目中的共享代码,但实现是针对 Windows Phone 8,抱歉,我只使用相同的命名空间。
  • @George Taskos,我正在使用 Xamarin.Forms 在 VS premium 2013 中为 WP 运行时开发。在我的 PCL 项目中,您在上面给出的同一行中也遇到了类似的异常。它适用于 Android 和 iOS。如何解决?如果您能在此处发布您的答案将会很有帮助。

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


【解决方案1】:
  1. 尝试在 requestStream.WriteAsync 之后使用或调用 requestStream.Close() 包围 requestStream
  2. 检查请求。Method = "POST";没有丢失。

【讨论】:

    【解决方案2】:

    不确定是否存在内存泄漏,但

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2018-04-20
      相关资源
      最近更新 更多