2016-06-20 7 views
1

Ich schreibe eine Methode, die JSON-Daten zurückgibt, indem eine GET-Anforderung an eine RestApi-URL gesendet wird. Wenn ich die Anwendung im Debug-Modus laufe, erhalte ich als Reaktion Daten.ASP.NET HTTPClient Abrufen des Anforderungsstatus Warten auf Aktivierung

Id = 337, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}"

Hier ist mein Code:

public class Methods 
{ 
    public static async Task<JObject> Get(string url, string username, string password) 
    { 
     var credentials = new NetworkCredential(username, password); 
     HttpClientHandler handler = new HttpClientHandler { Credentials = credentials }; 
     HttpClient client = new HttpClient(handler); 
     // client.BaseAddress = new Uri(url); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response = await client.GetAsync(url); 

     if (response.IsSuccessStatusCode) 
     { 
      return JObject.Parse(await response.Content.ReadAsStringAsync()); 
     } 
     return new JObject { response.StatusCode }; 
    } 
} 

Hier ist meine Ansicht, wo ich Daten zuzugreifen versuchen:

public IActionResult Index() 
{ 
    // Methods RestMethod = new Methods(); 
    var data = Methods.Get("http://url/products", "domain\userid", "Password"); 

    return View(); 
} 

Wenn ich hinzufügen Debug im Hinblick auf var data = ..... das ist, wo Ich bekomme waiting for activation.

Jede Hilfe wird wirklich geschätzt. :)

Danke,

Ray

+0

Richtig, also warten Sie derzeit nicht auf die Aufgabe ... bedenken Sie, dass 'data' die Aufgabe ist, nicht das' JObject'. –

+0

hmm .. also muss ich 'erwarten 'wie folgt hinzufügen' var data = await Methods.Get() '? – Ray

+1

Ich vermute ja, ja - was bedeutet, dass Ihre "Index" -Methode auch async sein muss. –

Antwort

2

Wenn Sie async verwenden wollen/erwarten Sie sollte es von der anrufenden Einstiegspunkt beginnen zu tun. Zur Zeit rufen Sie die Get Methode auf, die eine laufende Aufgabe zurückgibt, aber Sie warten nicht, bis sie abgeschlossen ist. Die einfachste Lösung ist für Ihren Index Methode Code sollte wie so geändert werden:

public async Task<IActionResult> Index() 
{ 
    // Methods RestMethod = new Methods(); 
    var data = await Methods.Get("http://url/products", "domain\userid", "Password"); 
    return View(); 
} 

Auch Stephen Cleary's blog auf async/await für weitere Details sehen, hat er zu diesem Thema ausführlich über geschrieben und auch Fallen und Muster bekannt.

+1

Danke. Das macht jetzt Sinn. :) – Ray

Verwandte Themen