我有一个我为.NET / Windows编写的控制台应用程序,我突然在unix系统上需要它。在大多数情况下,Mono在为我提供此功能方面取得了巨大的成功。
但是有一个小问题: 应用程序在运行时发出许多HttpWebRequests,而对于其中的一小部分,Mono返回错误:
获取响应流时出错(写入:身份验证或解密失败。):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上没有任何问题。
答案 0 :(得分:1)
即使URL不是HTTPS,我在Windows中运行Mono时也遇到此问题。让我大声说出来:它没有被重定。
解决方案一直是使用hack:
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate
{
return true;
};
我的猜测是,Mono不会在Windows密钥库中查找证书,因此找不到任何内容,因此HTTPWebXXXX未正确初始化,然后失败。
我的猜测是,任何麻烦重现错误的人都会知道他们用Mono做了什么(例如我不像),所以他们的环境设置正确,无法重现这个现实世界的问题。