c# – Mono:非SSL URI上的HttpWebRequest SSL错误

我有一个我为.NET / Windows编写的控制台应用程序,我突然需要在我的unix系统上使用它.在大多数情况下,Mono在为我提供此功能方面取得了巨大的成功.

但是有一个小问题:
应用程序在运行时发出许多HttpWebRequests,而对于其中的一小部分,Mono返回错误

Error getting response stream (Write: The authentication or decryption has Failed.): SendFailure

错误消息似乎表示SSL错误.但是,此应用程序不会向SSL加密的URI发出任何请求(即所有URI都是http://).

有问题的主要代码如下:

HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.UserAgent = UserAgent;
req.AuthenticationLevel = AuthenticationLevel.None;
req.AllowAutoRedirect = true;
req.KeepAlive = true;
req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);
req.Timeout = timeout;

if (useCompression) {
    req.Headers.Add(HttpRequestHeader.AcceptEncoding,"gzip,deflate");
}

编辑:为了运行此代码,您可以按如下方式定义虚拟变量:

string url = "http://example.com";
string UserAgent = "WhateverBot";
int timeout = 5000;
bool useCompression = true;

应该注意的是,代码在Windows / .NET上没有任何问题.

解决方法

在Windows中运行Mono时,即使URL不是HTTPS,我也遇到了这个问题.让我大声说出来:它没有被重定向.

解决方案一直是使用hack:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate 
{ 
    return true; 
};

我的猜测是,Mono不会在Windows密钥库中查找证书,因此找不到任何内容,因此HTTPWebXXXX未正确初始化,然后失败.

我的猜测是,任何麻烦重现你的错误的人都会知道他们正在用Mono做什么(例如我不像),因此他们的环境设置正确并且无法重现这个现实世界的问题.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...