vb.net任务(属于HttpResponseMessage)到HttpResponseMessage

vb.net任务(属于HttpResponseMessage)到HttpResponseMessage,vb.net,Vb.net,我有一个vb.net异步httpResponse函数,如下所示: 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 H

我有一个vb.net异步httpResponse函数,如下所示:

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
问题是,“resp”应该返回“正常”HttpResponseMessage,而不是(HttpResponseMessage的)任务

我怎么能得到这个?提前感谢您的帮助

致意 Martin

resp
是一种
HttpResponseMessage
。但是,该方法是
Async
。注意方法签名:

Public Async Function getWebserviceResponse(...) As Task(Of HttpResponseMessage)
因此,当代码在逻辑上返回
HttpResponseMessage
时,该方法在技术上返回
任务(HttpResponseMessage)
。其工作原理与其中调用的方法完全相同。请注意:

resp = Await client.PostAsync(baseUri, content, cancellationToken)
PostAsync
方法返回一个
任务(HttpResponseMessage)
,但该行代码将
HttpResponseMessage
放入
resp
变量中。这是因为使用了
wait
关键字

要实现相同的行为,任何调用
getWebserviceResponse()
方法的方法都应该执行相同的操作:

someVariable = Await getWebServiceResponse(...)

编辑:根据您下面的评论,您有以下代码行:

Dim myStreamReader As New StreamReader(webserviceResponse.getWebserviceResponse(....).Content.ReadAsStream‌​Async().Result) 
我怀疑应该将其更改为使用
wait
关键字:

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)

每个单独的异步操作都需要等待。

非常感谢David!今晚我将检查解决方案。如果我想用StreamReader调用getWebserviceResponse(),我仍然会得到以下错误:“Content”不是“System.Threading.Tasks.Task(System.Net.Http.HttpResponseMessage的)”的成员。我知道,语句中缺少wait:Dim myStreamReader作为新的StreamReader(webservicesponse.getwebservicesponse(..).Content.ReadAsStreamAsync().Result)如何使用wait改进invoke语句?提前非常感谢@马丁:那是因为内容不是任务的属性。正如答案中所建议的,你必须等待任务。另外,最好不要使用“Result”,而是等待结果。@Martin:我已经更新了答案,以解决您评论中的代码行。谢谢-请求现在可以正常工作了!非常有帮助:-)祝你周末愉快,并向你致意,马丁