2009-03-30 16 views
-1

これは私をうまく運転していて、どこでボールを落としているのか分かりません。私はgooglemonsta経由で見つかったいくつかの例に従わなかった。私がどこに行ったかへのポインタは、大いに訴えられるだろう。C#(httpwebrequest)で外部サイトにPOSTを呼び出す

 var writer = new StringWriter(); 
     param = "location=" + Server.UrlEncode(param); 
     byte[] paramStream = Encoding.ASCII.GetBytes(param + "&param2=value"); 
     var URL = "http://www.somesite.com"; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; sv-SE; rv:1.9.1b2) Gecko/20081201 Firefox/3.1b2"; 
     request.ContentLength = paramStream.Length; 
     using(var stream = request.GetRequestStream()) 
     { 
      stream.Write(paramStream, 0, paramStream.Length); 
     } 

     var response = request.GetResponse(); 

     string result; 
     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      result = sr.ReadToEnd(); 
     } 

ありがとう!

EDIT:私のサイトには(私はHTMLが戻ってきていますが)その打撃を伝えることができますが、パラメータはプッシュされません。私は基本的には成功した値が表示される場所を取得しています。私は最初に&を削除しようとしましたが、どこにもいられませんでした。

編集:変更を反映するように編集されたコード。

+0

どの部分が故障していますか? – JaredPar

+0

エラーメッセージが表示されますか、結果が表示されませんか? – Micah

+0

"私は基本的に値がどこに表示されるのかは成功していますが、それはどういう意味ですか?値は投稿されていますか?何がうまくいきませんか? – BFree

答えて

3

おそらく最初のパラメータの先頭から&を取り除くのでしょうか?それ以外は基本的には大丈夫です。 (実際のコードのパラメータ名を確認してください - サンプル中に "パラメータ"がありますが、それはほぼ確実に "パラメータ"になりますが実際のコードがどのようなものか、実際のサイトが期待するものはわかりません)

実際に何が起こっているかについての詳細をお知らせください。私たちはそれがうまくいかないことを知っていますが、さまざまな可能性のある失敗モードがたくさんあります:)

あなたはコンテンツの長さを指定していません。これが自動的にWebRequestで埋められるかわかりません。 WireSharkを使用して、アウトバウンドリクエストにそれが存在するかどうかを確認する価値があります。

ただ、実際の一般的な点として、あなたはWebResponseを処分すべきである、とあなたはすでに応答ストリームのためのusing文を持っている場合は、Closeを呼び出す必要はありません。

string result; 
using (WebResponse response = request.GetResponse()) 
{ 
    using (var sr = new StreamReader(response.GetResponseStream())) 
    { 
     result = sr.ReadToEnd(); 
    } 
} 
+0

応答に感謝Jon、簡単な質問:長さはどうですか? paramStream + URLを使用すると、b/cエラーが発生します。paramStreamまたはURLを使用すると、すべてを書き込まなかったため、長さを超過して失敗します。ありがとう! – Chance

+0

Paramstream.Lengthは正しいサイズである必要があります。 –

+0

はい - 私は場所の&infrontを削除すると、それを受け入れた。それでも、Wiresharkが2kbpsの驚くべき速さでダウンロードするのを待つことをやらなければならない。ヘルプマンに感謝する。 – Chance

1

はありますあなたは確かに投稿のために必要なすべての値を持っていますか?私はかつてのようなものだったフォーム上の隠し入力フィールドがあった場合持っていた:

<input name="action" type="hidden" id="action" value="login"> 

をし、私はPARAMとしてそれを供給しなければならなかった:あなたがしていることを確認し

&action=login 

フォームから何かを逃していないことは私が言っていることです...

EDIT:もう1つ:私はこれをやったところでもう一度私のコードを見て、私もこのラインを持っていたことに気づいたthere:

request.ContentLength = bytes.Length; 

必要があるかわかりませんが、長さを設定していないことに気付きました。

+0

クールな感謝 - それは無駄にそれを加えた。ちょうどフードの下で起こっていることを見るためにwiresharkを待っています。 – Chance

0

パラメータはそれ以来、キャリッジリターン/改行のような単純なものではありませんか?インターネット上のHTTPに関するいくつかのドキュメントを見ると、後で空白行が必要になることは明らかです。

(私は手動でウェブサーバーに接続してリクエストを貼り付けることをお勧めします)

関連する問題