当前位置: 首页 > 知识库问答 >
问题:

HttpClient.GetAsync:基础连接已关闭:发送时发生意外错误

金和雅
2023-03-14

这是我用来调用web API的代码。通过浏览器调用web api工作正常。

static void Main(string[] args)
{
    string url = "https://app1/api/AddUrl?longUrl=http://google.com";
    var result = GetTinyUrl(url).Result;
    Console.WriteLine(result.ShortUrl);     
}

protected static async Task<UrlResponse> GetUrl(string baseUrl)
{
    HttpClientHandler handler = new HttpClientHandler();
    handler.UseDefaultCredentials = true;

    var client = new HttpClient(handler);

    var response = client.GetAsync(baseUrl).Result;
    if (response.IsSuccessStatusCode)
    {
        HttpResponseMessage response1 = response;
        response.EnsureSuccessStatusCode();
        var resp = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<UrlResponse>(resp);
        return result;
    }

    return null;
}

共有1个答案

裴成文
2023-03-14

.result阻塞调用与异步等待混合会导致死锁。

如果使用async await,则始终保持异步,并避免为每个调用创建HttpClient的新实例,因为这可能导致套接的耗尽。

static Lazy<HttpClient> http = new Lazy<HttpClient>(() => {
    //Handle TLS protocols
    System.Net.ServicePointManager.SecurityProtocol =
        System.Net.SecurityProtocolType.Tls
        | System.Net.SecurityProtocolType.Tls11
        | System.Net.SecurityProtocolType.Tls12;

    var handler = new HttpClientHandler() {
        UseDefaultCredentials = true
    };

    var client = new HttpClient(handler);
    return client;
});

protected static async Task<UrlResponse> GetUrl(string baseUrl) {
    var client = http.Value;

    var response = await client.GetAsync(baseUrl); //Remove .Result and just await
    if (response.IsSuccessStatusCode) {
        HttpResponseMessage response1 = response;
        response.EnsureSuccessStatusCode();
        var resp = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<UrlResponse>(resp);
        return result;
    }
    return null;
}

由于这是一个控制台应用程序,并且只有一个线程调用异步,所以您必须更改在main中调用异步方法的方式

static void Main(string[] args) {
    string url = "https://app1/api/AddUrl?longUrl=http://google.com";
    var result = GetTinyUrl(url).GetAwaiter().GetResult(); //<-- 
    Console.WriteLine(result.ShortUrl);     
}
 类似资料:
  • 我得到这个例外 基础连接已关闭:发送时发生意外错误。 在我的日志中,它正在随机打破我们的OEM与电子邮件营销系统的集成。(1-4小时不等) 我的网站托管在Windows Server 2008 R2与IIS 7.5.7600。 该网站拥有大量OEM组件和全面的仪表板。除了我们的一个电子邮件营销组件(我们正在使用该组件作为仪表板中的iframe解决方案)外,其他所有内容都可以与网站的所有其他元素配合

  • 所以我正试图用SMTP和AWS向我自己发送电子邮件。我在配置中使用的电子邮件经过验证,因为我仍然在SES中使用沙盒模式。在运行脚本时,我不断收到错误即使我尝试与OpenSSL连接,但它已连接,但显示

  • 我试图连接使用JDBC MySQL驱动程序,但它不会工作。就我目前而言,我已经正确地遵循了每一步,并且MySQL驱动程序有蓝色的复选标记。我用的是Windows7。下面是我对错误的堆栈跟踪: ExecutionException:java.lang.runtimeException:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信

  • 但结果显示相同。有人能帮忙吗? 提前感谢S.K Setia

  • 我试图用下面的连接字符串连接到SQL服务器,但它给出了这个"错误连接超时过期" 我已尝试telnet,并且它已成功连接。但是,根据代码,即使我尝试指定默认端口,也无法连接。 我有做错什么吗?提前谢谢你。 Telnet结果

  • 我是Ruby on Rails的新手。我通过教程创建了两个基本的演示应用程序 PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。 而且有时(通常是在我重新启动postgresql时), PG::错误 服务器意外关闭了连接这可能意味着服务器在处理请求之前或处理请求时异常终止。无法发送启动数据包:管道中断 这是我的堆栈跟踪 我在Ubuntu12.04(因为goog