vb.net任务(属于HttpResponseMessage)到HttpResponseMessage
我有一个vb.net异步httpResponse函数,如下所示: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
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的)任务
我怎么能得到这个?提前感谢您的帮助
致意
Martinresp
是一种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.ReadAsStreamAsync().Result)
我怀疑应该将其更改为使用wait
关键字:
Dim myStreamReader As New StreamReader(Await (Await webserviceResponse.getWebserviceResponse(....)).Content.ReadAsStreamAsync())
或者,把它分解成一些不那么令人困惑的东西:
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:我已经更新了答案,以解决您评论中的代码行。谢谢-请求现在可以正常工作了!非常有帮助:-)祝你周末愉快,并向你致意,马丁