我尝试使用 WebRequest 将 POST 操作异步到 REST Web 服务。
因此,据我所知,我需要使用Task.Factory.FromAsync<T>(BeginXyz, EndXyz, null)
, 似乎它适用于GetRequestStream
pair 方法,因为我没有例外,并且 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) 在 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, Boolean requiresSynchronization) --- 在 System.Runtime.CompilerServices 处从先前引发异常的位置结束堆栈跟踪.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at Gtas.Core.ServiceRepository.d__8.MoveNext()
InnerException StackTrace:在 System.Net.Browser.ClientHttpWebRequest 的 System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)。<>c__DisplayClasse.b__d(Object sendState) 在 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 帖子中尝试了几种实现。似乎没有任何工作。
使用回调工作正常。但很高兴知道为什么我不能让它工作。
任何想法如何做到这一点?