最近咱們使用.NET3.5HttpWebRequest會報操做已超時但使用.NET4.0版本及以上卻能夠正常訪問。web
一段簡單的代碼以下:瀏覽器
string returnData = "";安全
try
{app
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(url);
webReq.Timeout = 30000;
webReq.KeepAlive = true;
webReq.Method = "POST";
webReq.ContentType = "application/xml; charset=utf-8";
webReq.ContentLength = buffer.Length;
webReq.ServicePoint.Expect100Continue = false;
Stream reqStream = webReq.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);
reqStream.Close();網站
using (HttpWebResponse webResp = (HttpWebResponse)webReq.GetResponse())
{
using (StreamReader sr = new StreamReader(webResp.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
returnData = sr.ReadToEnd();
}
}url
}
catch (Exception ex)spa
{xml
}utf-8
在兩個不一樣.NET版本下3.5會報操做超時,4.0版本及以上能夠正常訪問ssl
後來咱們發現請求的URL是HTTPS。咱們只是改變了HTTP和HTTPS的代碼又試了一次。但改變HTTPS HTTP不是解決方案。它是一個快速修復。使用HTTPS的網站在瀏覽器中工做。咱們獲得了來自瀏覽器的全部響應。然而,咱們獲得這個錯誤和HttpWebRequest。HttpWebRequest曾與HTTP URL而不使用HTTPS。後來咱們開始調查這個問題。咱們確保咱們的防火牆配置正確。咱們聯繫了第三方的人說他們不使用HTTPS請求。很顯然,有一些問題。咱們發現HttpWebRequest卡在密鑰交換階。解決方案而後咱們被迫使用HttpWebRequest ssl3代替TLS。servicepointmanager.securityprotocol=securityprotocoltype.ssl3;這裏的指定HttpWebRequest的安全協議能夠解決.NET3.5版本操做超時的問題,即第三方進行了協議規範。而.NET3.5版本和4.0及以上版本默認協議是有一些差別的。由此緣由引起的請求超時