WebRequest BeginGetResponse / EndGetResponse генерирует исключение при использовании Task.FromAsync

Я пытаюсь асинхронизировать операцию POST с веб-службой REST с помощью WebRequest.

Поэтому из того, что я знаю, мне нужно использовать Task.Factory.FromAsync(BeginXyz, EndXyz, null) , похоже, что он работает для GetRequestStream пары GetRequestStream , так как я не получаю исключения и байт [] заполнен со значениями.

 Stream requestStream = await Task.Factory.FromAsync( request.BeginGetRequestStream, request.EndGetRequestStream, null); byte[] postBytes = Encoding.UTF8.GetBytes(requestData); await requestStream.WriteAsync(postBytes, 0, postBytes.Length); 

Хорошо, приведенный выше код работает, а следующая часть бросает исключение.

 WebResponse webResponse = await Task.Factory.FromAsync( request.BeginGetResponse, request.EndGetResponse, null); 

Исключение я получаю по каждому запросу.

System.NotSupportedException: указанный метод не поддерживается.

Трассировки стека:

в System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, состояние объекта) в 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 prom, Boolean requireSynchronization) — Конец трассировки стека из предыдущего места, где было выбрано исключение — в System.Runtime.CompilerServices .TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult () в Gtas.Core.ServiceRepository.d__8.MoveNext ()

InnerException StackTrace: в System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) в System.Net.Browser.ClientHttpWebRequest. C__DisplayClasse.b__d (объект sendState) в System.Net.Browser.AsyncHelper. C__DisplayClass1.b__0 ( Объект sendState)

Полный код для выполнения запроса должен быть таким:

 Stream requestStream = await Task.Factory.FromAsync( request.BeginGetRequestStream, request.EndGetRequestStream, null); byte[] postBytes = Encoding.UTF8.GetBytes(requestData); await requestStream.WriteAsync(postBytes, 0, postBytes.Length); WebResponse webResponse = await Task.Factory.FromAsync( 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. Ничто не работает.

Использование обратных вызовов работает нормально. Но хорошо знать, почему я не могу заставить его работать.

Любые мысли, как это сделать?

  1. попробуйте окружить requestStream с помощью или вызвать requestStream.Close () после requestStream.WriteAsync
  2. проверьте request.Method = “POST”; не хватает.

Не уверен в утечке памяти, но

 WebResponse response = null; using (var stream = await Task.Factory.FromAsync(request.BeginGetResponse, result => { response = request.EndGetResponse(result); return response.GetResponseStream(); }, request)) { // TODO } response.Dispose();