2011-01-26 10 views
20

これはおそらく私が実行した最も奇妙な問題です。 POSTにURLを送信するコードがあります。コードは動作しません。また、フィドラーが実行されていないときに例外をスローしません。ただし、フィドラーが実行されているときに、コードはデータを正常に送信します。投稿ページにアクセスできるので、データがPOSTEDされているかどうかを知ることができます。これはおそらく非常に非意味的ですが、それは私が走っている状況であり、私は非常に混乱しています。HttpWebRequestは、フィドラーが実行されている場合を除いて動作しません。

byte[] postBytes = new ASCIIEncoding().GetBytes(postData); 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://myURL); 
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10"; 
req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3"); 
req.Headers.Add("Accept-Language", "en-US,en;q=0.8"); 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.ContentLength = postBytes.Length; 
req.CookieContainer = cc; 
Stream s = req.GetRequestStream(); 
s.Write(postBytes, 0, postBytes.Length); 
s.Close(); 
+1

をWebConfigのために次のエントリを追加した後は、すべてのリソースの解放必ずチャンスとシオマネキによってリダイレクト取得要求がこれを処理しているされていることを確認しますか? – BrokenGlass

+0

リダイレクトがある場合、私はそれをフィドラーのログの右側に表示しますか? – deadlock

+0

'postBytes'にURLエンコードされるべき文字が含まれている可能性はありますか?おそらく、バイブレーターがそれを静かにフィルタリングしていますか? –

答えて

14

これを試してみてください。応答を閉じないと、不良状態のソケットが.NETになります。あなたは、後のリクエストに干渉しないように、応答を閉じなければなりません。

2

まあ、私は数週間前、同様の問題に直面している、その理由はシオマネキが実行されている場合、それはフィドラーを通じて要求を渡すためにプロキシ設定を変更しますが、その閉じプロキシが何らかの形で残っひいてはていない場合ということでしたあなたのインターネット上のリクエストを許可してください。

私はIEとFirefoxのネットワーク設定をプロキシを使わないように設定してみましたが、うまくいきました。

あなたがGetResponseStream()を呼び出さない場合、あなたは応答を閉じることができない...それは同じ問題であってもよいし、

+0

あなたが言ったように私はIEとFirefoxでプロキシ設定をしていた。私はプロキシを使用しないように設定しましたが、それでも問題は解決しませんでした。 – deadlock

+0

2つのことを教えてください。コードからGETリクエストをURLに送信できますか? Second他のURLで試してみましたか? graph.facebook.com/meを試してください(明らかに、facebookはエラーを返しますが、データが通過しているかどうかを知ることができます) –

+0

はい通常GETリクエストを送信し、レスポンスを完全に受け取ることができます。別のURLで試してみますが、同じ問題が発生すると思います。 – deadlock

5

私は最近同様の問題がありました。 Wiresharkは、Fiddlerが動作していない限り、HTTPWebRequestがクライアントマシンを離れないことを示します。私はプロキシの設定を削除しようとしましたが、それは私の問題を解決しませんでした。私は、リクエストをHttpVersion.Version10に設定し、SendChuck、KeepAlive、および他の設定の有効/無効をすべて有効にしました。いずれも機能しませんでした。

最終的には、.Netがプロキシを検出し、要求が無視しようとしたかどうかを確認したところです。これにより、request.GetResponse()がすぐに例外をスローする問題が修正されました。私の場合は

IWebProxy proxy = request.Proxy; 

if (request.Proxy != null) 
{ 
    Console.WriteLine("Removing proxy: {0}", proxy.GetProxy(request.RequestUri)); 
    request.Proxy = null; 
} 
+0

私はrequest.Proxy = nullを呼び出しました。すべてのGetResponse()の前。コールと私のために働いた –

3

私は同じような状況を持っていたコードが外部サーバーへのプロキシの背後にある開発環境でIISExpress上で動作するアプリケーションからのPOSTを送信した(フィドラーが実行されている場合、POSTはのみ動作します)。どうやら、インターネットオプションでプロキシ設定が構成されていても、IISが実行されている環境では、その環境にアクセスできない可能性があります。職場環境では、web.configをプロキシの設定スクリプトのパスに更新するだけでした。 他のプロキシ設定を微調整する必要があるかもしれません。その場合、あなたの友人は、彼らが何であるかを説明するこのMSDNページです:http://msdn.microsoft.com/en-us/library/sa91de1e.aspx

最終的に私はアプリケーションのweb.configに次のコードを追加し、POSTを実行しました。

<configuration> 
    <system.net> 
    <defaultProxy> 
     <proxy scriptLocation="http://example.com:81/proxy.script" /> 
    </defaultProxy> 
    </system.net> 
</configuration> 
7

取得後にHttpWebResponseを閉じます。

私は同じ問題を抱えていました。そして、私はそれぞれの要求の後に応答を閉じ始めました。そして、ブーミング、フィドラーを実行する必要はありません。

これは、同期コードの擬似です:

request.create(url); 

///codes 

httpwebresponse response = (httpwebresponse)request.getresponse(); 

/// codes again like reading it to a stream 

response.close(); 
+0

私の場合は、リダイレクトを追跡するために 'GetWebResponse'をオーバーロードするカスタムWebClientを使用しています。これを読んだ後、新しいリクエストを開始する前に既存の応答を閉じるわけではないことに気付きました。 –

+0

これはありがとう!数時間頭を撫でた後、私のために働いた。 –

2

私は、Pythonと同じ問題に遭遇した - 私はバイオリン弾きは彼らを実行すると、それらを実行したときに、ローカルサーバへのリクエストは404で失敗していましたが、正しく動作していた。

フィドラーは、HTTPトラフィックのプロキシとして機能し、ローカルマシンからのすべての要求がネットワークにまっすぐに出るのではなく、Fiddlerを経由するようになっています。私が、私はローカルサーバへのリクエストを作成した正確な状況で

は、通常のトラフィックは、ネットワーク接続 Bypass proxy server for local addressesオプションがチェックされた Proxy serverペインのためのプロキシを経由して Local Area Network (LAN) Settingsに渡します。

私の疑惑は、「ローカルアドレス用のプロキシサーバーをバイパスする」が必ずしもプログラミング言語ではなく、プロキシサーバーの詳細であることです。 Fiddlerはそのポリシーを認識しているため、Fiddlerの作業は要求されますが、プログラミング言語からの直接の要求はありません。

ローカルサーバーの要求のプロキシを何も設定しないと、コードから正しく機能しませんでした。明らかに、展開中に内部から外部のサーバーに移行する場合は、それが問題になる可能性があります。

1

私は同じシナリオに直面しました。Windows認証の背後にあるエンドポイントにPOSTしていました。

Fiddler keeps a pool of open connectionsですが、C#テストまたはpowershellスクリプトは、フィドラーなしで実行するとにはなりません。

したがって、HttpWebRequestでプロパティUnsafeAuthenticatedConnectionSharingをtrueに設定することで、テスト済みのスクリプトで開いている認証済み接続のプールを維持できるようにすることができます。 more about it here, microsoft KBを読んでください。その記事の両方のケースでは、彼らはと2つのリクエストを行っていることがわかります。最初のものは認証ヘッダー(ハンドシェイクを完了するため)を取得するための簡単なGETまたはHEADで、もう1つは前に取得したヘッダーを使用するPOSTです。

明らかにあなたはできません(悲しみ)は直接POST HTTPリクエストでハンドシェイクを行います。

1

私たちはここで非常に似た問題を抱えています。私たちはリモートサービスに接続しており、ほとんど常に失敗するようです。しかし、(Webサーバーから)フィドラーを介してプロキシすると、すべてがうまく機能します。私たちは今、デバッグしようとしていますが、これは非常によく似た問題のようです。

0

常にコンストラクトを使用してください。コール

using (HttpWebResponse responseClaimLines = (HttpWebResponse)requestClaimLines.GetResponse()) 
       { 
        using (StreamReader reader = new StreamReader(responseClaimLines.GetResponseStream())) 
        { 
         responseEnvelop = reader.ReadToEnd(); 
        } 
       } 

がファイル

<system.net> 
<connectionManagement> 
<add address="*" maxconnection="30"/> 

関連する問題