HTTP请求PowerAutomate错误: "基础连接已关闭, 发送时发生错误"
【摘要】 我们经常会编写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;
详细解释
- ServicePointManager.Expect100Continue:确定是否在发送包含有效负载的请求之前等待100-Continue响应。
- ServicePointManager.CheckCertificateRevocationList:检查证书吊销列表,以验证证书的有效性。
- ServicePointManager.DefaultConnectionLimit:设置默认的连接数限制。
- ServicePointManager.SecurityProtocol:指定使用的安全协议类型。在这里设置为
3072
,表示使用TLS 1.2协议。 - ServicePointManager.ServerCertificateValidationCallback:自定义服务器证书验证回调,忽略证书错误。
通过设置这些属性,可以确保HTTP请求使用合适的安全协议,并且忽略证书错误,从而避免出现“基础连接已关闭,发送时发生错误”的问题。
总结
在使用PowerAutomate进行HTTP请求时,如果遇到“基础连接已关闭,发送时发生错误”问题,可以通过调整安全协议类型来解决。确保代码中正确设置了ServicePointManager.SecurityProtocol
属性,并根据.NET版本选择合适的协议类型。通过上述方法,可以有效避免此类错误,提高HTTP请求的成功率。
希望本文能帮助大家解决类似问题。如果有更多疑问或建议,欢迎在评论区留言交流。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)