使用Task.FromAsync时,WebRequest BeginGetResponse/EndGetResponse

本文关键字:BeginGetResponse EndGetResponse WebRequest Task FromAsync 使用 | 更新日期: 2023-09-27 18:29:20

我尝试使用WebRequest将POST操作异步化为REST web服务。

因此,据我所知,我需要使用Task.Factory.FromAsync<T>(BeginXyz, EndXyz, null),这似乎适用于GetRequestStream对方法,因为我没有得到任何异常,字节[]中充满了值。

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:不支持指定的方法。

StackTrace:

位于System.Net.Browser.AncHelper.BeginOnUI(SendOrPostCallbackbeginMethod,对象状态)System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResultasyncResult)在System.Func`2.Invoke(T arg)在System.Threading.Tasks.TaskFactory `1.FromAsyncCoreLogic(IAsyncResultiar,函数`2 endFunction,操作`1 endAction,任务`1 promise,布尔要求同步)---从上一个引发异常的位置开始的堆栈结尾跟踪--在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务task),位于System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()在Gtas.Core.ServiceRepository.d_8.MoveNext()

InnerException StackTrace:在System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResultasyncResult)System.Net.Browser.ClientHttpWebRequest。<>c__DisplayClasse.b_d(对象sendState)System.Net.Browser.AncHelper。<>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文章中的一些实现。似乎什么都不起作用。

使用回调运行良好。但很高兴知道为什么我不能让它发挥作用。

有没有想过如何做到这一点?

使用Task.FromAsync时,WebRequest BeginGetResponse/EndGetResponse

  1. 尝试使用包围requestStream,或在requestStream.WriteSync之后调用requestStream.Close()
  2. 检查请求。方法="POST";没有丢失

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

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();
相关文章:
  • 没有找到相关文章