2017-07-03 191 views
2

我使用HttpClient来向API发出GET请求,该请求应返回JSON数据,但我的请求被卡住在GetStreamAsync。我调试过它之前,当它来到await that.GetStreamAsync(url);我的调试器不见了。消失。我试图修复它一天,但仍然无法工作。起初,我认为这是我的代理问题,但事实并非如此。然后,我尝试使用HttpRequest它工作正常。HttpClient.GetStreamAsync卡住

这是我的课。

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; 
    } 
} 

这是我的控制器。

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

这是我Http包版本:

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

这里是我已经尝试的方法。

var stream = await that.GetStreamAsync(url).ConfigureAwait(false); 
+0

如果'Get()'没有在UI线程中调用,请试试这个。这会改变什么吗? 'var stream = await that.GetStreamAsync(url).ConfigureAwait(false);' –

+0

@QualityCatalyst我在它没有工作之前尝试。我再试一次,仍然无法工作。 – Natsathorn

+1

你为什么不使用'GetStringAsync'来代替的特殊原因? –

回答

2

由于@UltimaWeapon是正确的,因此您没有使用异步控制器,因此一切都以同步方式运行。尽可能多的你必须等待所有的异步调用来避免线程块。

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

虽然我不知道在控制器返回bool的。 AFAIK返回ActionResult是常用的。因为我不使用这个,所以我不能评论它。

+0

你们两个都对。谢谢 – Natsathorn