HTTP请求PowerAutomate错误: "基础连接已关闭, 发送时发生错误"

举报
Damon小智 发表于 2024/05/29 10:13:36 2024/05/29
【摘要】 我们经常会编写POST请求,将需要传递的参数发送给目标地址端口。最近在使用PowerAutomate的HTTP触发器时,我遇到了一个问题。我向PowerAutomate触发器URL发送POST请求,但没有成功,后端捕获的异常信息为“基础连接已关闭,发送时发生错误”。这个问题是由于安全协议导致的,更换安全协议类型即可解决。

问题原因

这个问题是由于安全协议类型导致的。在使用HTTP请求时,默认的安全协议类型可能不符合当前目标服务器的要求。通过设置合适的安全协议类型,可以解决此问题。

解决方案

以下是解决该问题的代码示例:

using System;
using System.IO;
using System.Net;
using System.Text;

// 传入目标地址Url和Post的参数jsonParas,返回目标端口的响应返回值
public static string HttpRequestByPost(string Url, string jsonParas) {
    // 设置服务属性
    ServicePointManager.Expect100Continue = true;
    ServicePointManager.CheckCertificateRevocationList = true;
    ServicePointManager.DefaultConnectionLimit = 100;
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // 设置协议类型
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

    // 创建一个HTTP请求
    string strURL = Url;
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
    request.Method = "POST";
    request.ContentType = "application/json";
    request.Accept = "*/*";
    byte[] payload;
    string paraUrlCoded = jsonParas;
    payload = Encoding.UTF8.GetBytes(paraUrlCoded);
    request.ContentLength = payload.Length;

    // 发送请求,获得请求流
    Stream writer;
    try {
        writer = request.GetRequestStream();
    } catch (Exception) {
        writer = null;
        Console.Write("连接服务器失败!");
    }
    writer.Write(payload, 0, payload.Length);
    writer.Close();

    // 获得返回值
    HttpWebResponse response;
    try {
        response = (HttpWebResponse)request.GetResponse();
    } catch (WebException ex) {
        response = ex.Response as HttpWebResponse;
    }
    Stream s = response.GetResponseStream();
    StreamReader sRead = new StreamReader(s);
    string postContent = sRead.ReadToEnd();
    sRead.Close();
    return postContent;
}

核心代码解析

解决问题的核心代码在于服务属性配置部分:

// 设置服务属性
ServicePointManager.Expect100Continue = true;
ServicePointManager.CheckCertificateRevocationList = true;
ServicePointManager.DefaultConnectionLimit = 100;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; // 设置协议类型
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

其中,SecurityProtocol的设置至关重要。需要根据.NET的版本选择合适的协议类型。

不同.NET版本的设置

  • .NET 4.0 设置
    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
    
  • .NET 4.5 及以上版本设置
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
    

详细解释

  1. ServicePointManager.Expect100Continue:确定是否在发送包含有效负载的请求之前等待100-Continue响应。
  2. ServicePointManager.CheckCertificateRevocationList:检查证书吊销列表,以验证证书的有效性。
  3. ServicePointManager.DefaultConnectionLimit:设置默认的连接数限制。
  4. ServicePointManager.SecurityProtocol:指定使用的安全协议类型。在这里设置为3072,表示使用TLS 1.2协议。
  5. ServicePointManager.ServerCertificateValidationCallback:自定义服务器证书验证回调,忽略证书错误。

通过设置这些属性,可以确保HTTP请求使用合适的安全协议,并且忽略证书错误,从而避免出现“基础连接已关闭,发送时发生错误”的问题。

总结

在使用PowerAutomate进行HTTP请求时,如果遇到“基础连接已关闭,发送时发生错误”问题,可以通过调整安全协议类型来解决。确保代码中正确设置了ServicePointManager.SecurityProtocol属性,并根据.NET版本选择合适的协议类型。通过上述方法,可以有效避免此类错误,提高HTTP请求的成功率。

希望本文能帮助大家解决类似问题。如果有更多疑问或建议,欢迎在评论区留言交流。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。