欢迎光临 Rick 's BLOG
日志首页  | C# .Net编程  | 原创作品  | 生活点滴  | C\C++相关  | 多媒体相关※ERMP  | VB相关  | 其它运维与编程  |  留言簿
C#屏幕截图,指定区域截图,窗口截图的实现 Nginx配置中location下的 root和 alias 使用及区别
未知  C# 使用 HttpClient错误?SocketException:现有连接被远程主机强行关闭
[ 发布日期:11个月前 (12-22) ]   [ 来自:本站原创 ] [分类:C# .Net编程]
C#中使用 HttpClient 访问https站点,出现以下错误。

System.AggregateException
  HResult = 0x80131500
  Message =发生一个或多个错误。
  来源= System.Private.CoreLib
  堆栈跟踪:
   在System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
  
内部例外1:
HttpRequestException:无法建立SSL连接,请参阅内部异常。

内部例外2:
IOException:无法从传输连接中读取数据:现有连接被远程主机强行关闭。

内部例外3:
SocketException:现有连接被远程主机强行关闭
[复制到剪贴板]


class Program
{
    static 
void Main(string[] args)
    {
        var 
url "https://google.com";
        var (
statusCodehtml) = requestString(url);
        
Console.WriteLine("%d %s"statusCodehtml);
    }

    static 
CookieContainer cc = new CookieContainer();

    static 
HttpClientHandler handler = new HttpClientHandler AllowAutoRedirect falseCookieContainer cc };

    public static 
async Task<(int statusCodestring content)> requestStringAsync(string url)
    {
        
ServicePointManager.ServerCertificateValidationCallback += (sendercertchainsslPolicyErrors) => true;
        
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls SecurityProtocolType.Tls11 SecurityProtocolType.Tls12;
                                                                     
// | SecurityProtocolType.Ssl3;
        
using (var request = new HttpRequestMessage RequestUri = new Uri(url), Method HttpMethod.Get })
        
using (var client = new HttpClient(handler))
        {
            var 
response await client.SendAsync(request); // Error (actual line)
         
            
var statusCode = (int)response.StatusCode;
            var 
content await response.Content.ReadAsStringAsync();
            return (
statusCodecontent);
        }
    }

    public static (
int statusCodestring contentrequestString(string url)
    {
        return 
requestStringAsync(url).Result;
    }




按上面调整 ServicePointManager 后在 .net framework环境中就可以正常运行了。

在.Net Core的环境中还可能发生问题。

.Net Core中可以使用以下机制之一来配置进程以使用较旧的HttpClientHandler:

从代码中,使用AppContext类:

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

也可以通过配置文件来设置AppContext开关。

可以通过环境变量DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER实现相同的目的。
要选择退出,请将值设置为false或0。
引用通告地址 (0):
复制引用地址https://www.rickw.cn/trackback/317
复制引用地址https://www.rickw.cn/trackback/317/GBK
[ 分类:C# .Net编程  | 查看:787 ]

暂时没有评论,快来发表一个评论吧。
发表评论
作者:   用户:[访客] 
评论:

表  情
禁止表情 | 禁止UBB | 禁止图片 | 识别链接
对不起,你没有权限上传附件!
验证:
 
PoweredBy R-Blog V1.00 © 2004-2024 WWW.RICKW.CN, Processed in second(s) , 7 queries    京ICP备17058477号-5