2017-07-01 3 views
1

Ich habe eine Client-Server-App. Wpf - Web API Ich habe ein paar Probleme, da dies auf einer Maschine funktioniert, aber wenn ich auf eine andere Maschine umschalte, tut es das nicht.HttpClient Senden, aber keine Anfrage erhalten

public async Task<IEnumerable<T>> Get() 
    { 
     var result = (IEnumerable<T>)null; 

     //Gets to this line and does not throw exception 
     var response = await _httpClient.GetAsync(BaseApiAddress); 

     if (!response.IsSuccessStatusCode) 
     { 
      ThrowInvalidException(response); 
     } 
     var resultAsString = await response.Content.ReadAsStringAsync(); 
     result = JsonConvert.DeserializeObject<IEnumerable<T>>(resultAsString); 
     return result; 
    } 

API-Methode:

[HttpGet] 
    public virtual IEnumerable<T> Get() 
    { 
     var items = Repository.Get().ToArray(); 
     return items; 
    } 

und Repository:

public IQueryable<T> Get() 
    { 
     return _context.Set<T>(); 
    } 

ich zum api bekommen und es wird die Daten während des Debugging-Code durch sie die Daten haben und sehen aus, als ob Dort vervollständigt es die Methode auf der API. All dies besagt, dass es nie zur GetAsync-Methode zurückkehrt.

Ich habe hier eine Mauer getroffen und weiß wirklich nicht einmal, wo ich anfangen soll. Irgendwelche Vorschläge wären sehr hilfreich.

+1

Sieht wie ein klassischer Fall von Deadlock aus, der durch den Synchronisierungskontext verursacht wird. Versuchen Sie 'var response = erwarten _httpClient.GetAsync (BaseApiAddress) .ConfigureAwait (false);' –

+0

das war es! ich danke dir sehr! – JamTay317

+0

Seien Sie vorsichtig, mit configureAwait, um den Deadlock zu beheben ist ein Hack und wird nicht in jeder Situation funktionieren, ist es besser, nur keine asynchronen Anrufe zu blockieren. – Crowcoder

Antwort

1

Wenn Sie unter einem Synchronisationskontext ausgeführt, erhalten Sie eine Sackgasse, wenn:

  • Der Anrufer synchron auf eine Aufgabe wartet (zB task.Result
  • Innerhalb der Aufgabe aufrufen, verwenden Sie await

Das Update ist .ConfigureAwait(false) zu verwenden, um die Fortsetzung auf dem Synchronisationskontext zu vermeiden Entsendung:

var response = await _httpClient.GetAsync(BaseApiAddress).ConfigureAwait(false); 

Natürlich sollten Sie so viel wie möglich vermeiden, synchron auf eine Aufgabe zu warten.

+0

danke, also was ich getan habe, war warten MethodeThatCallsApi() zu entfernen. Warten(); Danke nochmal – JamTay317

Verwandte Themen