2

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

因此,据我所知,我需要使用Task.Factory.FromAsync<T>(BeginXyz, EndXyz, null), 似乎它适用于GetRequestStreampair 方法,因为我没有例外,并且 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 帖子中尝试了几种实现。似乎没有任何工作。

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

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

4

2 回答 2

0
  1. 尝试在 requestStream.WriteAsync 之后使用或调用 requestStream.Close() 包围 requestStream
  2. 检查 request.Method = "POST"; 没有丢失。
于 2014-02-06T21:20:46.277 回答
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();
于 2017-08-01T03:13:51.863 回答