HttpClient.GetStreamAsync卡住了

时间:2017-07-03 04:22:13

标签: c# asp.net asp.net-mvc

我使用HttpClient向API发出GET请求,该请求应返回JSON数据,但我的请求仍停留在GetStreamAsync。我调试它之前await that.GetStreamAsync(url);我的调试器消失了。消失。我试着把它固定了一天,但仍然没有用。起初,我认为这是我的代理问题,但事实并非如此。然后,我尝试使用HttpRequest它可以正常工作。

这是我的班级。

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

1 个答案:

答案 0 :(得分: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。通常使用返回ActionResult的AFAIK。由于我不使用它,我无法评论它。