2011-07-30 5 views
0

を使用してHTTPプロキシを使用すると、私は完全なヘッダとコンテンツは、Webクライアントでは使用できませんHttpWebRequestの私は同じのためのソケットを使用しておりますので、ここでのコードははソケット

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コンテンツをダウンロードするために必要なのです。

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クライアントとは異なり、ソケットは、ユーザー名とパスワードを使用してプロキシを設定することはできません。

私の質問は単純です: HTTPプロキシとソケットを使った接続方法を教えてください。

解決策がある場合、webclientやその他の回答を推奨している場合は、ソケットを使用する強い理由があります。オープンソースライブラリの提案、リンク、チュートリアルを招待してください。

+0

ソケットを使用することの1つの欠点は、ソケット自体がHTTPプロキシについてではないことです。上のコードは私が働いている場所(私たちのブラウザのすべてがプロキシ経由でインターネットに接続するように設定されている場所)で走っても接続できません。 .NETランタイムは、WebClientまたはHttpWebRequestクラスを使用する場合は、コントロールパネルからインターネット設定をスニッフィングし、プロキシ経由で接続します。どちらもクッキーとヘッダーを設定できるように見えますが、どうしてあなたがソケットにドロップしたいのかわかりません。おそらく以下の答えをWebClientコードに適用することができます。お役に立てれば。 – selbie

+0

WebClientは私にワードプレスのブログをログインさせません。ワードプレスのブログはwebclientで処理すると壊れたいくつかの有線の長いクッキーを設定しますが、httpwebrequestですが、ソケットで手動で処理したときに動作します。 WebClientまたはHttpWebResponseから生のヘッダーを取得できます。ソケットが不要です。 –

+0

WebClient.ResponseHeadersにSet-Cookieフィールドが含まれているかどうか評価しましたか? – selbie

答えて

2

プロキシのユーザー名とパスワードは、HTTPヘッダーを介して送信されます。 は、あなたのリクエストヘッダにProxy-Authorizationフィールドを使用します。

Proxy-Authorization: Basic <BASE64("USER:PASS")> 

あなたの要求のいずれかが応答「407プロキシ認証が必要」を取得する場合は、許可するときに使用するあなたの認証モードを教えてくれるレスポンスヘッダフィールドProxy-Authenticateを読むことができます。 上にはBasic(最も一般的なもの)がありますが、DigestNTLMのようなものがあります。他の2つについて読むことができますhere

+0

ええ、ネットビット腐敗、インターネットアーカイブを救助する! http://web.archive.org/web/20101126155446/http://www.z9hg4bk.org/sip/hf/proxy-authorization.html – Maks

1

あなたの例では、HTTPリクエストヘッダーではなくHTTPレスポンスヘッダーが表示されています。 が必要なHTTPリクエストヘッダーは何ですか。は送信できません。

これをソケットで直接行うことは、仮定を単純化すること(例えば、サーバーがチャンクされたエンコーディングや圧縮などを使用しないなど)をしなければ非常に難しくなります。たとえば、サーバーがキープアライブ接続を使用している場合、現在のコードは機能しません。あなたは、HTTPWebRequestを使用してReflectionを使用して必要な内部メンバーを調整するほうがずっと良いでしょう。

また、FiddlerCoreをアプリケーション(www.fiddler2.com/core)に入れることもできます。 FiddlerCoreには、プロキシ、圧縮、チャンクエンコーディングなどの完全なHTTPスタックが含まれています。

関連する問題