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

标签 c# ssl mono httpwebrequest

我有一个为 .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 上运行没有任何问题。

最佳答案

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

解决方案是使用 hack:

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

我的猜测是,Mono 不会在 Windows keystore 中查找证书,因此找不到任何证书,因此 HTTPWebXXXX 未正确初始化,然后错误地失败。

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

关于c# - Mono:非 SSL URI 上的 HttpWebRequest SSL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3394293/

相关文章:

c# - Convert.ToDateTime DD :HH:mm:ss C#/ASP. 净 GridView RowDataBound

apache - 如何将 Apache 2.4 配置从 SSL 支持更改为 TLS

java - 使用 ResteasyClient 时 AWS API Gateway 出现 SSLHandShakeException

c# - 我可以更改 C# 中的当前堆栈跟踪吗?

c# - 一般创建正确具体类型的属性

c# - 如何从 mvc 4 razor 中的共享 View 访问 Controller 操作?

linux - Raspbian 上的 Mono 和 MongoDB

c# - 如何从字节数组(在内存中)运行方法?

c# - 对 Listview C# 上的项目进行排序

amazon-web-services - AWS ELB – 不安全的响应