c# - 在 c# httpclient 上设置超时不起作用

标签 c#

我将超时设置为 1 毫秒,但是当我测试时,所有的 http 调用似乎都工作正常,几乎就像它忽略了超时一样。如何让它发挥作用?

谢谢

    private static HttpClient client = new HttpClient()
    {
        Timeout = TimeSpan.FromMilliseconds(1)
    }; // re-use the object

    /// <summary>
    /// Make a GET call.
    /// </summary>
    public static async Task<string> GetAsync(string uri, string token_type, string access_token, string accept, string content_type)
    {
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
        if (content_type != null) request.Headers.TryAddWithoutValidation("Content-Type", content_type);
        if (accept != null) request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(accept)); // ACCEPT header
        if (token_type != null && access_token != null) request.Headers.Authorization = new AuthenticationHeaderValue(token_type, access_token);
        HttpResponseMessage g = await client.SendAsync(request);

        if (g.IsSuccessStatusCode)
        {
            return await g.Content.ReadAsStringAsync();
        }
        else
        {
            throw new ExternalException(await g.Content.ReadAsStringAsync(), (int)g.StatusCode);
            //throw new ExternalException(await g.Content.ReadAsStringAsync() + "      Reason: " + g.ReasonPhrase + "      Message: " + g.RequestMessage + "      Status Code: " + g.StatusCode + "      Token Type: " + token_type + "      Content Type: " + content_type + "      Accept: " + accept, (int)g.StatusCode);
        }
    }

    /// <summary>
    /// Make a POST call. The content type should be embedded in the postData already.
    /// </summary>
    public static async Task<string> PostAsync(string uri, string token_type, string access_token, HttpContent postData, string accept)
    {
        string mes = await postData.ReadAsStringAsync();
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri)
        {
            Content = postData // CONTENT-TYPE header
        };

        if (accept != null) request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(accept)); // ACCEPT header
        if (token_type != null && access_token != null) request.Headers.Authorization = new AuthenticationHeaderValue(token_type, access_token);
        HttpResponseMessage g = await client.SendAsync(request);

        if (g.IsSuccessStatusCode)
        {
            return await g.Content.ReadAsStringAsync();
        }
        else
        {
            throw new ExternalException(await g.Content.ReadAsStringAsync(), (int)g.StatusCode);
            //throw new ExternalException(await g.Content.ReadAsStringAsync() + "      Reason: " + g.ReasonPhrase + "      Message: " + g.RequestMessage + "      Status Code: " + g.StatusCode + "      Token Type: " + token_type + "      Post Data: " + mes + "      Accept: " + accept, (int)g.StatusCode);
        }
    }

最佳答案

问题是,这段代码是在后台线程上执行的。如果您从不等待它(通过显式等待,或在某处获取“结果”等),异常本身将在后台线程中被忽略(成为未处理的异常)。当然,您应该通过在某个时间点获取结果(或等待)来防止这种情况发生。在您的情况下,您可以像这样使用它:

GetAsync.Wait();

这将为您抛出异常。

关于c# - 在 c# httpclient 上设置超时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305784/

相关文章:

c# - 使用 Npgsql 和 SSL 证书身份验证时出现 SSL 错误

c# - DataRowView 对象在从 DataGrid 获取值时获取空值

c# - Strawberry Shake 代码生成无法解析类型引用 'None:Any'

c# - 从 DocumentDB 查询时出现异常 : Microsoft. Azure.Documents.RequestRateTooLargeException

javascript - 使用 SignalR 获取角色中的用户列表

javascript - 如何在page_load中添加javascript

c# - 在 Visual Studio 调试器中打印漂亮的对象图

c# - 如何制作可滚动的文本框列表?

c# - 有没有等同于 petapoco 的 Scala?

c# - 为什么按类型添加 AutoValidateAntiForgeryTokenAttribute 不起作用?