我需要下載網絡內容,包括完整的標頭就像採用Socket
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/html; charset=utf-8
Expires: Sat, 30 Jul 2011 06:19:13 GMT
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Date: Sat, 30 Jul 2011 06:20:13 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Connection: Transfer-Encoding
Set-Cookie: _SS=SID=0B3A2FD5AA7943BC92252BB73BD7C9CA; domain=.bing.com; path=/
Set-Cookie: MUID=CE6F495249204D82A8F620B7317FC59E; expires=Mon, 29-Jul-2013 06:20:13 GMT; domain=.bing.com; path=/
Set-Cookie: OrigMUID=CE6F495249204D82A8F620B7317FC59E%2c95e9e1eafdef40d6a24497335843fac6; expires=Mon, 29-Jul-2013 06:20:13 GMT; domain=.bing.com; path=/
Set-Cookie: OVR=flt=0&flt2=0&flt3=0&flt4=0&flt5=0&flt6=0&flt7=0&flt8=0&flt9=0&flt10=0&flt11=0&ramp1=snrport4-release&release=or3&preallocation=0&R=1; domain=.bing.com; path=/
Set-Cookie: SRCHD=D=1881020&MS=1881020&AF=QBLH; expires=Mon, 29-Jul-2013 06:20:13 GMT; domain=.bing.com; path=/
Set-Cookie: SRCHUID=V=2&GUID=A2EAC1B8990D46619C897016C94B5C4B; expires=Mon, 29-Jul-2013 06:20:13 GMT; path=/
Set-Cookie: SRCHUSR=AUTOREDIR=0&GEOVAR=&DOB=20110730; expires=Mon, 29-Jul-2013 06:20:13 GMT; domain=.bing.com; path=/
000037E4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:Web="http://schemas.live.com/Web/"><head><meta content="text/html; charset=utf-8" http-equiv="content-type" /><script type="text/javascript">//<![CDATA[
由於具有完整標題的內容在Web客戶端不可使用HTTP代理,HttpWebRequest的我使用插座的一樣,這裏是代碼。
using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP))
{
IPHostEntry entry = Dns.GetHostEntry(fullUrlAddress);
socket.ReceiveTimeout = 3000;
socket.Connect(entry.AddressList[0], 80);
string request = string.Empty;
string build_request = string.Empty;
if (cookieJar.Count != 0)
{
request = "GET {0} HTTP/1.1\r\nHost: {1}\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nConnection: keep-alive\r\nReferer: {0}\r\nCookie: {2}\r\n\r\n";
build_request = string.Format(request, requestedUri.AbsoluteUri, requestedUri.Host, GetCookies(requestedUri));
}
else
{
request = "GET {0} HTTP/1.1\r\nHost: {1}\r\nUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-us,en;q=0.5\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\nConnection: keep-alive\r\nReferer: {0}\r\nCookie: {2}\r\n\r\n";
build_request = string.Format(request, requestedUri.AbsoluteUri, requestedUri.Host, "PREF=ID=19495678a6a3dd6e:U=c5ce8e4e3f61da69:FF=0:TM=1311310634:LM=1311310636:S=gbV7hD2dPfycsf8Q; NID=49=dN3QceFFBFxwsCXM43HCRJF_oxoBpUHuUWt2tpoofEDFcRhj7TWWV4EFQNuVYP1GhyBAsQr3oOeohsJp31x8kb_iXiGcQFh1a3IFsPTNKjzJv_NgSK8ssG956PJO7jH-");
}
byte[] data = Encoding.UTF8.GetBytes(build_request);
socket.Send(data, data.Length, 0);
int bytes = 0;
byte[] bytesReceived = new byte[10240];
string currentBatch = string.Empty;
try
{
do
{
bytes = socket.Receive(bytesReceived);
currentBatch = Encoding.ASCII.GetString(bytesReceived, 0, bytes);
responseString.Append(currentBatch);
}
while (bytes > 0);
}
catch (Exception)
{
}
socket.Close();
}
它可以正常使用,但我不知道如何使用用戶名和密碼HTTP代理,插座不像Web客戶端不能設置代理連接。
我的問題很簡單: 如何在Socket中使用帶有憑證的HTTP代理連接?
如果您有解決方案,如果您推薦使用webclient或其他沒有回覆,我有充分的理由使用套接字,對開源庫提供建議,鏈接,受邀教程等請回復。
使用套接字的一個缺點是套接字本身並不是關於HTTP代理的。因此,如果我將它運行在我工作的地方(所有瀏覽器都配置爲通過代理連接到互聯網),上面的代碼將無法連接。如果您使用WebClient或HttpWebRequest類,.NET運行時將從控制面板嗅探您的Internet設置並通過代理進行連接。兩者似乎都允許你設置cookie和標題,我不知道你爲什麼想要下載到套接字。也許下面的答案可以應用於您的WebClient代碼。希望這可以幫助。 – selbie
WebClient不讓我登錄wordpress博客,cos wordpress博客設置一些有線的長cookie,當webclient處理時會被破壞,而httpwebrequest,但是當通過套接字手動處理時工作,這是切換到套接字的唯一原因,如果我可以從WebClient或HttpWebResponse獲得原始頭文件,然後不需要套接字。 –
您是否評估WebClient.ResponseHeaders是否包含Set-Cookie字段? – selbie