2016-06-23 2 views
1

У меня есть функция vb.net асинхронной HTTPResponse так:vb.net Task (Of HttpResponseMessage) для HttpResponseMessage

Public Async Function getWebserviceResponse(ByVal sb As StringBuilder, ByVal baseUri As Uri, ByVal Method As String, ByVal User As String, ByVal Password As String) As Task(Of HttpResponseMessage) 

    Dim client As HttpClient = New HttpClient() 
    client.BaseAddress = baseUri 

    Dim authHeader As AuthenticationHeaderValue = New AuthenticationHeaderValue(
     "Basic", 
     Convert.ToBase64String(
      System.Text.ASCIIEncoding.ASCII.GetBytes(
       String.Format("{0}:{1}", User, Password)))) 

    client.DefaultRequestHeaders.Authorization = authHeader 

    Dim content As New StringContent(sb.ToString, System.Text.Encoding.UTF8, "application/json") 

    Dim resp As HttpResponseMessage 
    Dim cancellationToken As CancellationToken 

    If Method = "Post" Then 
     resp = Await client.PostAsync(baseUri, content, cancellationToken) 

    ElseIf Method = "Put" Then 
     resp = Await client.PutAsync(baseUri, content, cancellationToken) 

    End If 

    Return resp 

End Function 

Проблема в том, что "соответственно" должен вернуть "нормальный" HttpResponseMessage и не Задача (из HttpResponseMessage) ...

Как я могу это получить? Заранее спасибо за вашу помощь!

С наилучшими пожеланиями Мартин

ответ

1

respявляетсяHttpResponseMessage. Однако метод Async. Обратите внимание на подпись метода:

Public Async Function getWebserviceResponse(...) As Task(Of HttpResponseMessage) 

Таким образом, хотя код логически возвращая HttpResponseMessage, метод технически возвращает Task(Of HttpResponseMessage). Это работает точно так же, как и методы, вызываемые в нем. Здесь следует отметить:

resp = Await client.PostAsync(baseUri, content, cancellationToken) 

Метод PostAsync возвращает Task(Of HttpResponseMessage), но эта строка кода положить HttpResponseMessage в переменную resp. Это связано с использованием ключевого слова Await.

Для достижения такого же поведения, любой метод, который вызывающую ваш метод getWebserviceResponse() должен сделать то же самое:

someVariable = Await getWebServiceResponse(...) 

Edit: Основываясь на ваш комментарий ниже, у вас есть эта строка кода:

Dim myStreamReader As New StreamReader(webserviceResponse.getWebserviceResponse(....).Content.ReadAsStream‌​Async().Result) 

Что я подозреваю, что должно быть изменено, чтобы это использовать Await ключевое слово:

Dim myStreamReader As New StreamReader(Await (Await webserviceResponse.getWebserviceResponse(....)).Content.ReadAsStream‌​Async()) 

Или, чтобы разбить его на что-нибудь менее запутанным:

Dim responseMessage As HttpResponseMessage = Await webserviceResponse.getWebserviceResponse(....) 
Dim responseStream As Stream = Await responseMessage.Content.ReadAsStreamAsync() 
Dim myStreamReader As New StreamReader(responseStream) 

Каждая отдельная операция асинхронной нужно будет ожидаться.

+0

Большое спасибо Дэвиду! Сегодня вечером я проверю решение. – Martin

+0

Если я хочу вызвать мой getWebserviceResponse() с StreamReader, я получаю следующую ошибку: «Содержимое» не является членом «System.Threading.Tasks.Task (Of System.Net.Http.HttpResponseMessage)». я знаю, Await IST отсутствует в заявлении: \t Dim myStreamReader As New StreamReader (. WebserviceResponse.getWebserviceResponse (....) Content.ReadAsStreamAsync() Результат.) Как я могу улучшить заявление Invoke с AWAIT ? Заранее большое спасибо! – Martin

+0

@Martin: Это потому, что контент не является свойством задачи. Вы должны * ждать * задачи, как это было предложено в ответе. Кроме того, лучше не использовать «Результат», а ждать результата. – David

Смежные вопросы