操作
當向一個https的url上發送請求,報錯:未能創建 SSL/TLS 安全通道;
報錯前實現代碼如下:
/// <summary> /// 判斷遠程文件是否存在 /// </summary> /// <param name="fileUrl">文件路徑</param> /// <returns></returns> public ActionResult FileExists(string fileUrl) { var result = new ResultModel(); HttpWebRequest re = null; HttpWebResponse res = null; try { re = (HttpWebRequest)WebRequest.Create(fileUrl); res = (HttpWebResponse)re.GetResponse(); if (res.ContentLength != 0) { result.Success = true; } } catch (Exception ex) { result.Success = false; result.Message = ex.Message; } finally { if (re != null) { re.Abort();//銷毀關閉連接 } if (res != null) { res.Close();//銷毀關閉響應 } } return Json(result, JsonRequestBehavior.AllowGet); }
原因:
ssl證書不受信任,驗證失敗;
解決方案:
1:先加入命名空間
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
2:再重載CheckValidationResult方法,返回true
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) {
//直接確認,否則打不開
return true;
}
3:然后在HttpWebRequest req =(HttpWebRequest) WebRequest.Create(URL)前面加上如下一行代碼
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);//驗證服務器證書回調自動驗
最終實現代碼如下:
/// <summary> /// 判斷遠程文件是否存在 /// </summary> /// <param name="fileUrl">文件路徑</param> /// <returns></returns> public ActionResult FileExists(string fileUrl) { var result = new ResultModel(); HttpWebRequest re = null; HttpWebResponse res = null; try { ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); re = (HttpWebRequest)WebRequest.Create(fileUrl); res = (HttpWebResponse)re.GetResponse(); if (res.ContentLength != 0) { result.Success = true; } } catch (Exception ex) { result.Success = false; result.Message =ex.Message; } finally { if (re != null) { re.Abort();//銷毀關閉連接 } if (res != null) { res.Close();//銷毀關閉響應 } } return Json(result, JsonRequestBehavior.AllowGet); }