2016-06-23 52 views
1

に私はこのようなvb.net非同期をhttpResponse機能があります。問題は「RESPは」HttpResponseMessage「普通」ではなくを返す必要があること、であるvb.netタスク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の)...

どのように私はこれを得ることができますか?ご協力いただきありがとうございます!

敬具 マーティン

答えて

1

respHttpResponseMessageです。ただし、方法はAsyncです。メソッドシグネチャを注:コードは、論理的HttpResponseMessageを返している間

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

したがって、技術方法はTask(Of HttpResponseMessage)を返します。これは、そこで呼び出されているメソッドとまったく同じです。ここでの注意:

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

PostAsync方法はTask(Of HttpResponseMessage)を返しますが、コード行はresp変数にHttpResponseMessageを入れています。これは、キーワードAwaitを使用しているためです。

は同じことを行う必要があり、あなたの getWebserviceResponse()メソッドを呼び出す任意の方法を同じ動作を実現するには、次の

someVariable = Await getWebServiceResponse(...) 

編集:は以下のコメントをもとに、あなたはこのコード行を持っている:

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

Awaitキーワードを使用するには、これを次のように変更する必要があります。

Dim myStreamReader As New StreamReader(Await (Await webserviceResponse.getWebserviceResponse(....)).Content.ReadAsStream‌​Async()) 
それとも、少し混乱何かにそれを破る:

​​

個々非同期操作が待望される必要があるであろう。

+0

大変ありがとうございました!私は今晩解決策を確認します。 – Martin

+0

StreamReaderでgetWebserviceResponse()を呼び出す場合、次のエラーが表示されます。「コンテンツ」は「System.Threading.Tasks.Task(Of System.Net.Http.HttpResponseMessage)」のメンバーではありません。 私は、知っているのawaitイスト声明の中で行方不明:新規のStreamReaderとして\t 薄暗いmyStreamReader(。webserviceResponse.getWebserviceResponse(....)Content.ReadAsStreamAsync()結果。)私はのawaitと呼び出し文を向上させることができますどのように ?事前にどうもありがとうございました! – Martin

+0

@Martin:ContentはTaskのプロパティではないからです。答えに示唆されているように、タスクを待つ*必要があります。また、結果を待つのではなく、「結果」を使用しないことをお勧めします。 – David

関連する問題