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