C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: WebClient.UploadValuesの動作がおかしい


(過去ログ 89 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■53003 / inTopicNo.1)  WebClient.UploadValuesの動作がおかしい
  
□投稿者/ ちょ〜し (1回)-(2010/08/31(Tue) 22:02:06)

分類:[C#] 

2010/09/01(Wed) 13:02:19 編集(投稿者)
2010/09/01(Wed) 13:02:12 編集(投稿者)
2010/08/31(Tue) 22:10:00 編集(投稿者)

はじめまして。
下記の環境でネットワークプログラムを組んでいる者です。

OS:WindowsXP(SP3)
エディタ:Visual Studio 2008
言語:C#(.NET Framework 2.0←インストールされているのは3.0です)

PHP:5.2.13

htaccessでBasic認証が掛かっているPHPファイルに対してWebClient.UploadValuesを行った所、
$_POST、$_GET共にデータがなく、$_SERVER["REQUEST_METHOD"]にデータが入力されていました。
var_dump($_SERVER)を行うとこのような感じです。

array(29) {
中略
["REQUEST_METHOD"]=>
string(11) "abc=defPOST";
}

Basic認証を外すと問題なく動作します。
ブラウザからフォームで送信した場合も全く問題ありません。

htaccessが問題なのでしょうか?
色々試してみたのですが、401や500エラーになってしまうだけでうまく動作しません。

ご教授宜しくお願いします。

以下ソースです。

----------------
C#
----------------
using(WebClient wc = new WebClient()) {
wc.Credentials = new NetworkCredential("ユーザ名", "パスワード");
NameValueCollection values = new NameValueCollection();
values.Add("abc", "def");
string str = Encoding.UTF8.GetString(wc.UploadValues("http://*****.com/test.php", values));
MessageBox.Show(str);
}

----------------
.htaccess
----------------
Options -Indexes

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /home/***/.htpasswd
AuthGroupFile /dev/null
AuthName "password"
AuthType Basic
Require valid-user
order deny,allow

----------------
PHP
----------------
<?
var_dump($_SERVER);
?>
引用返信 編集キー/
■53014 / inTopicNo.2)  Re[1]: WebClient.UploadValuesの動作がおかしい
□投稿者/ todo (45回)-(2010/09/01(Wed) 13:11:55)
HTTPモニタソフトで監視してみては?
お勧めは、「InetSpy/横取り丸」
引用返信 編集キー/
■53019 / inTopicNo.3)  Re[2]: WebClient.UploadValuesの動作がおかしい
□投稿者/ ちょ〜し (2回)-(2010/09/01(Wed) 14:01:28)
todo様

情報ありがとうございます。
確認してみたところ、メソッド欄に"abc=defPOST"とPOSTと送信するはずのデータが混在しています。

内部で2回送信しているようなのですが、1回目は問題有りません。
2回目(恐らく認証する際)に上記のような現象が確認されます。

URL メソッド
1回目:http://*****.com/test.php POST
2回目:http://*****.com/test.php abc=defPOST

引用返信 編集キー/
■53027 / inTopicNo.4)  Re[3]: WebClient.UploadValuesの動作がおかしい
□投稿者/ todo (46回)-(2010/09/01(Wed) 15:57:44)
> URL メソッド
> 1回目:http://*****.com/test.php POST
> 2回目:http://*****.com/test.php abc=defPOST

一回目のリクエストデータが処理されずに、2回目のリクエストの先頭に付いちゃっているのですかね。

HttpWebRequestとHttpWebResponseを使った方法
http://dobon.net/vb/dotnet/internet/webrequestpost.html

で、WebRequest.PreAuthenticate を true にすれば、一回のリクエストで完結するかな。
引用返信 編集キー/
■53030 / inTopicNo.5)  Re[4]: WebClient.UploadValuesの動作がおかしい
□投稿者/ ちょ〜し (3回)-(2010/09/01(Wed) 16:39:34)
2010/09/01(Wed) 17:25:36 編集(投稿者)

todo様

再度確認してみましたが、状況は変わりませんでした。
InetSpyの詳細を見るとこのようになっています

----------------------------------------------------------------------------
abc=defPOST /test.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: Basic dGVzdDp0ZXN0
Host: www.*****.com
Content-Length: 49
Expect: 100-continue

abc=def

----------------------------------------------------------------------------




----------------------------------------------------------------------------
ソースコード
----------------------------------------------------------------------------
Encoding enc = Encoding.UTF8;
WebRequest req = WebRequest.Create("http://*****.com/test.php");
string values = "value1=aiueo&value2=kakikukeko&value3=sashisuseso";

req.Method = "POST";
//ContentTypeを"application/x-www-form-urlencoded"にする
req.ContentType = "application/x-www-form-urlencoded";
//POST送信するデータの長さを指定
byte[] bytes = enc.GetBytes(values);
req.ContentLength = bytes.Length;

req.Credentials = new NetworkCredential("test", "test");
req.PreAuthenticate = false;

//データをPOST送信するためのStreamを取得
System.IO.Stream reqStream = req.GetRequestStream();
//送信するデータを書き込む
reqStream.Write(bytes, 0, bytes.Length);
reqStream.Close();

//サーバーからの応答を受信するためのWebResponseを取得
System.Net.WebResponse res = req.GetResponse();
//応答データを受信するためのStreamを取得
System.IO.Stream resStream = res.GetResponseStream();
//受信して表示
System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc);
string result = sr.ReadToEnd();
//閉じる
sr.Close();

MessageBox.Show(result);

引用返信 編集キー/
■53031 / inTopicNo.6)  Re[5]: WebClient.UploadValuesの動作がおかしい
□投稿者/ todo (47回)-(2010/09/01(Wed) 16:49:14)
2010/09/01(Wed) 16:55:47 編集(投稿者)

> req.PreAuthenticate = false;

これをtrueにすれば、一回目のリクエストで

> Authorization: Basic dGVzdDp0ZXN0

を付けてくれると思ったのですが...

> Expect: 100-continue
の問題であれば
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39019&forum=7
引用返信 編集キー/
■53033 / inTopicNo.7)  Re[6]: WebClient.UploadValuesの動作がおかしい
□投稿者/ ちょ〜し (4回)-(2010/09/01(Wed) 17:35:51)
todo様

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.ServicePoint.Expect100Continue = false;

と指定することで無事解決いたしました。


何度もお答えいただきありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -