2017-07-03 2 views
2

Ich benutze HttpClient, um eine GET Anfrage an die API zu machen, die mir JSON-Daten zurückgeben soll, aber meine Anfrage bleibt bei GetStreamAsync stecken. Ich habe es vorher debuggt, als es zu await that.GetStreamAsync(url); kommt mein Debugger ist weg. Verschwinden. Ich versuche, es für einen Tag zu beheben, aber immer noch nicht arbeiten. Zuerst denke ich, dass es mein Proxy-Problem war, aber das ist es nicht. Dann versuche ich HttpRequest es funktioniert gut zu verwenden.HttpClient.GetStreamAsync stecken

Hier ist meine Klasse.

public async Task<bool> RequestToApi(string response) 
{ 
    HttpClientHandler httpClientHandler = new HttpClientHandler(); 
    if (_cdnResProxy.Value.Length > 0 && _cdnResPort.Value > 0) 
    { 
     httpClientHandler.Proxy = new WebProxy(string.Format("{0}:{1}", 
     _cdnResProxy.Value, 
     _cdnResPort.Value)) 
     { BypassProxyOnLocal = true }; 
    } 

    //try to remove proxy here already but still not work 

    using (var hClient = new HttpClient(httpClientHandler)) 
    { 
     hClient.DefaultRequestHeaders.ExpectContinue = false; 
     var result = await hClient.Get<ResponseObj>(
      $"https://www.example.com/api/somepath?something={someValue}"); 

     return result.success; 
    } 
} 

public static class HttpClientExtension 
{ 
    public static async Task<T> Get<T>(this HttpClient that, string url) 
    { 
     var stream = await that.GetStreamAsync(url); //stuck here 
     JsonSerializer serializer = new JsonSerializer(); 
     T data; 
     using (StreamReader streamReader = new StreamReader(stream)) 
     { 
      data = (T)serializer.Deserialize(streamReader, typeof(T)); 
     } 

     return data; 
    } 
} 

Dies ist mein Controller.

[HttpPost] 
    [SwaggerVisible] 
    [SwaggerOperation("SignIn_VerifyCaptchaAction")] 
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(bool))] 
    public bool RecaptchaSubmit(string response) 
    { 
     return _service.RecaptchaSubmit(response).Result; 
    } 

Das ist meine Http Paketversion:

<package id="System.Net.Http" version="4.3.2" targetFramework="net462" /> 

Hier ist die Methode, die ich schon versuchen.

+0

Wenn 'Get()' nicht in einem UI-Thread aufgerufen wird, versuchen Sie Folgendes. Ändert das etwas? 'var stream = erwarte das.GetStreamAsync (url) .ConfigureAwait (false);' –

+0

@QualityCatalyst Ich versuche das, bevor es nicht funktioniert. Ich probiere es nochmal, arbeite immer noch nicht. – Natsathorn

+1

Gibt es einen besonderen Grund, warum Sie 'GetStringAsync' nicht verwenden? –

Antwort

2

Da @UltimaWeapon richtig war, verwenden Sie keinen asynchronen Controller, also läuft alles synchron. So weit wie möglich müssen Sie auf alle asynchronen Aufrufe warten, um Thread-Blockaden zu vermeiden.

Obwohl ich nicht weiß, bool in der Steuerung zurückgeben. AFAIK, das einen ActionResult zurückbringt, wird allgemein benutzt. Da ich das nicht verwende, kann ich nichts dazu sagen.

+0

Sie haben zwei recht. Vielen Dank – Natsathorn