質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

5802閲覧

【C#】WebClientを使ったPOSTを続けたときにうまくいかない

annamild_2011

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

2クリップ

投稿2016/11/23 10:08

###前提・実現したいこと
Visual Studio2015 C#でフォームにボタンを一つ配置してボタンを押すとWebClientを使ってPOST送信したパラメータごとにHTMLを取得したいのですが思った通りに動いてくれません。

解決策を教えて頂けないでしょうか。
宜しくお願い致します。

###発生している問題・エラーメッセージ

ソースコードに書いておりますparam1を送信して返ってくるstringは思った通りの結果が返ってくるのですがparam2を送信したときに返ってくるのがparam1を送信したときに返ってくるstringと同じ内容が返ってきます。param1~5で返ってきたstringの成否をまとめると以下のようになってしまいます。 param1 〇 param2 ×(param1と同じstring) param3 〇 param4 〇 param5 ×(param4と同じstring)

###該当のソースコード

private void button1_Click(object sender, EventArgs e) { string url = "http://test.co.jp/test.html"; List<string> paramList = new List<string>(); paramList.Add("param1"); paramList.Add("param2"); paramList.Add("param3"); paramList.Add("param4"); paramList.Add("param5"); foreach (string p in paramList) { string html = getHTML(url, p); Console.WriteLine(html); } } private string getHTML(string url, string param) { System.Net.WebClient wc = new System.Net.WebClient(); System.Collections.Specialized.NameValueCollection nc = new System.Collections.Specialized.NameValueCollection(); nc.Add("key", param); byte[] resData = wc.UploadValues(url, nc); wc.Dispose(); string resText = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(resData); return resText; }

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio2015 C# .NET4.5

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/23 10:27

Fiddler などのキャプチャツールを使って要求・応答の内容を調べて、サーバー or クライアントどちらに問題があるか切り分けてください。
annamild_2011

2016/11/23 11:04

情報を頂きありがとうございます。Fiddlerを使ってどこに問題があるか追及してみたいと思います。
guest

回答3

0

自己解決

ブラウザからの接続とWebClientからの接続をFiddlerで見比べたときに
WebClientでの接続のときだけHeaderに100-continueが存在したので

ServicePointManager.Expect100Continue = false;

をコードに入れることで思った通りの結果を得ることができるようになりました。

情報を頂いたSurferOnWwwさん、aglkjgggさんありがとうございました。

投稿2016/11/23 13:38

annamild_2011

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

解決とはちょっと関係ないアドバイスですが、(解決もできると思いますが)
WebClientを使わなければならない理由がないのであれば、HttpClientを使った方がよいです。
(理由は...調べればすぐ出てきそうな話なので省略しますw)

また、WebClientを毎回Newしているようですが、このクラスの変数として保持して、クラスのDisposeのタイミングで破棄したほうが色々と無駄がなく、また安全です。

一応解決策(HttpClient版)書いておくと、

csharp

1var client = new HttpClient();

という変数があるとして、

csharp

1client.DefaultRequestHeaders.ExpectContinue = false;

と書くか、WebConfigに書くかで対応できます。

投稿2016/11/24 07:17

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annamild_2011

2016/11/24 13:42

HttpClientの方が良いんですね。 サンプルコードまで書いて下さりありがとうございます。 今後はHttpClientを使うようにしたいと思います。 アドバイス頂きありがとうございました。
guest

0

プログラム的には正しいので、SurferOnWwwさんの書いているとおりFiddlerなどのWebデバッガを用いてご自身で突き詰めていくしかありません。

投稿2016/11/23 10:53

aglkjggg

総合スコア769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

annamild_2011

2016/11/23 11:07

ありがとうございます。教えて頂いたFiddlerを使って突き詰めてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問