我尝试使用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) beginMethod,Object state)at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult的 asyncResult)在System.Func`2.Invoke(T arg)at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult的 iar,Func`2 endFunction,Action`1 endAction,Task`1 promise,Boolean requiresSynchronization) ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Gtas.Core.ServiceRepository.d__8.MoveNext()
InnerException StackTrace:at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult的 asyncResult)at System.Net.Browser.ClientHttpWebRequest&LT;&GT; c__DisplayClasse.b__d(对象 sendState)at System.Net.Browser.AsyncHelper&LT;&GT; 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帖子的几个实现。似乎没什么用。
使用回调工作正常。但很高兴知道为什么我不能让它发挥作用。
有任何想法如何实现这一目标?
答案 0 :(得分:0)
答案 1 :(得分: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();