当我执行以下代码时
System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => {
return true;
};
var webClient = new WebClient();
var s = webClient.DownloadString("https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123");
我总是得到一个System.Net.WebException:无法创建SSL / TLS安全通道
当我执行此
时https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123
例如直接在Firefox或Internet Explorer中,它可以工作并返回结果。
我应该怎样做,这也是我的代码在浏览器中执行的?
我已经阅读了stackoverflow中有关此问题的其他帖子 - 但他们没有解决我的问题: - (
答案 0 :(得分:15)
如果你关闭fiddler(如果你打开它)并添加以下内容则异常应该消失
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
或者至少它在我尝试你的代码时为我做了
try
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
var webClient = new WebClient();
var s = webClient.DownloadString("https://jtlplugins.x-volution.de/api.php?apikey=yS5VS7OiG1ukiIqLzCSYuFCjeF1qSskKOQeCtVxh&do=pruefe_app&cappid=123&chardwareid=DC0D-BFEA-6F79-58DE-21E9-BA3A-B288-C46F&clizenzschluessel=123");
MessageBox.Show("Result" + s);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
不安全的代码警告 - 即使我假设您已经知道这一点,并且不是您的代码获得WebException的原因,我在最初发布此消息后的几十年内为潜在的未来读者添加了警告题。代码:
System.Net.ServicePointManager.ServerCertificateValidationCallback =(发件人,证书,链,错误)=> { 返回true; };
将忽略任何证书验证错误,因此根据定义并不完全安全。请参阅问题C# Ignore certificate errors?
答案 1 :(得分:1)
下面是一个继承WebClient类,它解决了许多诸如此类的一般问题...
using System;
using System.Net;
namespace YourProgram.Web
{
public class WebClient : System.Net.WebClient
{
public WebClient()
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
this.container = new CookieContainer();
}
public WebClient(CookieContainer container)
{
this.container = container;
}
public CookieContainer CookieContainer
{
get { return container; }
set { container = value; }
}
private CookieContainer container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest r = base.GetWebRequest(address);
var request = r as HttpWebRequest;
if (request != null)
{
request.CookieContainer = container;
}
return r;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = base.GetWebResponse(request, result);
ReadCookies(response);
return response;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
ReadCookies(response);
return response;
}
private void ReadCookies(WebResponse r)
{
var response = r as HttpWebResponse;
if (response != null)
{
CookieCollection cookies = response.Cookies;
container.Add(cookies);
}
}
}
}
享受...