2017-06-19 3 views
0

Ich entwickle gerade einen einfachen C# Formflow-Bot, der die Werte erfasst und diese Werte an eine externe API sendet, die JSON-Daten von der externen API zurückerhält und Card Attachments erstellt auf die Ergebnisse zurückgegeben. Ich mache den Anruf an den externen api in dem Delegierten OnCompletion wie folgt zu halten es einfach ich vorbei keine Werte an die api (zu Testzwecken)C# BotFramework FormFlow, übergebe Werte an eine externe API

.OnCompletion(async (context, profileForm) => 
       { 
        var reply = context.MakeMessage(); 

        var carsFromApi = await GetCarsAsync("/api/values"); 
        reply.AttachmentLayout = AttachmentLayoutTypes.Carousel; 
        reply.Attachments = GetCards(carsFromApi); 

        await context.PostAsync(reply); 

        // Tell the user that the form is complete 
       }) 

ich den Anruf an die api machen und zu speichern die Ergebnisse in „carsFromApi“, trete ich in dem, was der folgende Code-Schnipsel wird

private static async Task<List<Car>> GetCarsAsync(string path) 
     { 
      List<Car> car = new List<Car>(); 
      HttpResponseMessage response = await client.GetAsync(path); 
      if (response.IsSuccessStatusCode) 
      { 
       car = await response.Content.ReadAsAsync<List<Car>>(); 
      } 

      return await response.Content.ReadAsAsync<List<Car>>(); 
     } 

Problem ist, wenn ich F10 drücken und in die nächste Zeile gehen, die „reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;“. Die lokale Variable, die die Autos "carsFromApi" gespeichert hat, ist jetzt null. Dies ist der Teil, wo alles umfällt. Ich kann dieses "carsFromApi" nicht an "reply.Attachments = GetCards (carsFromApi)" weitergeben; Ich habe versucht, die Daten in einer privaten Variablen zu speichern, aber das scheint auch Null zu sein. Die externe API funktioniert, weil sie nur eine Liste mit statischem Text zurückgibt. Irgendwelche Ideen? Danke im Voraus.

+0

Sind Sie sicher, dass die GetCarsAsync Methode wird in der if (response.IsSuccessStatusCode) Pfad endet ? –

+0

Hallo, Vielen Dank für Ihren Kommentar, das Problem war mit dem Antwortstatuscode. Können Sie eine Antwort posten, damit ich dies als Antwort markieren kann? Ich denke, dass ich Frage für den HTTPClient-Fehler öffnen muss: "Diese Instanz hat bereits eine oder mehrere Anforderungen gestartet. Eigenschaften können nur vor dem Senden der ersten Anfrage geändert werden." Das tritt in dem Konstruktor meines Formularformulars auf, nachdem die Kartenanlagen dem Benutzer angezeigt worden sind, nicht sicher, wie diese Ausnahme behoben werden kann. –

+0

Fertig. Ich habe ein paar Empfehlungen hinzugefügt. In Bezug auf die Ausnahme, schau in den Foren vor dem Posten, da ich mir sicher bin, dass es ein ziemlich häufiges Problem ist. –

Antwort

0

Basierend auf dem, was Sie beschreiben, klingt es, dass Ihr Code nicht über den Pfad der if (response.IsSuccessStatusCode) existiert. Überprüfen Sie, ob dieser Punkt erreicht ist, da ich vermute, dass eine Ausnahme oder etwas mit der Anfrage nicht in Ordnung ist.

Alternativ können Sie versuchen, die Anfrage in der ResumeAfter<T> Methode tun Sie beim den Form statt, dass in den OnCompletion Delegierten fordern

Verwandte Themen