使用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文章中的一些实现。似乎什么都不起作用。
使用回调运行良好。但很高兴知道为什么我不能让它发挥作用。
有没有想过如何做到这一点?
- 尝试使用包围requestStream,或在requestStream.WriteSync之后调用requestStream.Close()
- 检查请求。方法="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();