2016-04-07 10 views
2

Ich habe diesen Code, der ein Authentifizierungstoken von einer API zurückgeben soll, die ich gebaut habe. Ich habe für einen asynchronen Ansatz gegangen, aber jetzt bin ich nicht sicher, was in meinem speziellen Fall zu tun, um die Zeichenfolge-Token zu bekommen, nicht die Aufgabe, Hier ist mein Code:C# Wie bekomme ich eine Zeichenfolge von Aufgabe <string> nach einer Webanfrage?

private async Task<string> AuthLogin(string user, string pass) 
    { 
     string username = user; 
     string password = pass; 
     string url = "http://localhost:8000/login"; 

     try { 
      //retrieve auth token from /login 
      var client = new HttpClient(); 
      client.BaseAddress = new Uri(url); 

      string jsonData = "{\"username\":" + "\"" + username + "\",\"password\":" + "\"" + password + "\"}"; 

      var content = new StringContent (jsonData, Encoding.UTF8, "application/type"); 
      HttpResponseMessage resp = await client.PostAsync (new Uri (url), content); 

      string s = await resp.Content.ReadAsStringAsync(); 
      string result = Convert.ToString (s); 
      //some formatting to extract the actual token string 
      string[] tokenParts = result.Split (':'); 
      string token = tokenParts[1].Replace ("\"", ""); 

      return token; 

     } 
     catch (WebException) { 
      //error handling here 
      return null; 
     } 

    } 

    public string StoreTokenFromLogin(string user, string pass) 
    { 
     var token = AuthLogin (user, pass).Result; 
     System.Diagnostics.Debug.WriteLine(token); 
     System.Diagnostics.Debug.WriteLine(token.GetType()); 

     return token; //should be a string 
    } 

Dann in meiner Seite Ansicht, I Habe einen Event-Handler, der das tut:

loginButton.Clicked += (object sender, EventArgs e) => { 
      Authentication a = new Authentication(); 
      string tok = a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text); 

      authLabel.Text = tok; 

     }; 

Wenn ich jedoch auf den Button klicke, bleibt die App stehen. (Ich bin in Xamarin.Forms).

+0

Welcher Typ ist 'Token'? Ihre Methode gibt eine 'Task ' zurück und die 'Task .Result' sollte die' Zeichenfolge' zurückgeben. – Sven

+0

Ich habe gerade versucht, das Ergebnis der AuthLogin() zu bekommen, die mir eine Zeichenfolge geben sollte, tut es aber nicht. Ich könnte mich jedoch irren, weil ich mich zu sehr verwirrte. – alexcons

+0

Ja, Aufgabe . Ergebnis ist der richtige Weg, um die 'Zeichenfolge' zu ​​erhalten. Was ** genau ** gibt es zurück? – Sven

Antwort

4

Ihre Event-Handler, um diese Änderung

loginButton.Clicked += async(object sender, EventArgs e) => 
{ 
    Authentication a = new Authentication(); 
    string tok = await a.StoreTokenFromLogin(usernameInput.Text, passwordInput.Text); 
    authLabel.Text = tok; 
}; 

, dass der Anruf warten wird das Token zu erhalten, ohne den aktuellen Thread zu binden (vermutlich der UI-Thread).

Und Ihre StoreTokenFromLogin zu diesem.

public async Task<string> StoreTokenFromLogin(string user, string pass) 
{ 
    var token = await AuthLogin (user, pass); 
    System.Diagnostics.Debug.WriteLine(token); 
    System.Diagnostics.Debug.WriteLine(token.GetType()); 

    return token; //should be a string 
} 

Grundsätzlich ist die Idee ist, dass, wenn Sie mit async und await beginnen es zu sprudeln steigen durch Ihre Methode aufruft, bis Sie etwas, das ein Feuer tun sollten, und vergessen (async void), die in diesem Fall ist Ihr Ereignishandler.

Wenn Sie Task.Result verwenden, dann blockieren Sie den aktuellen Thread, während Sie warten und den Punkt der Verwendung von async - await vereiteln.

Verwandte Themen