前提・実現したいこと
VB.NETで、WEBページを持つ機械にPOSTするプログラムを作成しています。
WEBページにあるクエリをPOSTすると、機械は自動で再起動するようになっています。
機械は再起動するので、POSTした後結果が返ってくることはないです。
よってPOST送信のみしたいのであって、受信は今回は考えていません。
GetResponse()を実行しないとメインスレッドがブロックしてしまうので、便宜上GetResponse()を呼んでいます。
発生している問題・エラーメッセージ
1回目のGetResponse呼び出しは早いのですが、2回目以降が5秒程度かかってしまいます。
該当のソースコード
vb.net
1 Public Shared Function HttpWebClientStreamPostTest(ByVal ip As String) As Integer 2 Dim url As String = "http://" & ip & "/restart.html" 3 4 '文字コードを指定する 5 Dim enc As System.Text.Encoding = 6 System.Text.Encoding.GetEncoding("sjis") ' sjis 7 8 'POST送信する文字列を作成 9 Dim postData As String = "Setting=Restart" 10 Dim postDataBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(postData) 11 12 'WebRequestの作成 13 Dim req As System.Net.WebRequest = 14 System.Net.WebRequest.Create(url) 15 req.Method = "POST" 16 req.ContentType = "application/x-www-form-urlencoded" 17 req.ContentLength = postDataBytes.Length 18 req.Proxy = Nothing ' 有ってもなくても速さ変わらず 19 ' 認証情報を付与する 20 Dim cache As New System.Net.CredentialCache() From {} 21 cache.Add(New Uri(url), "Basic", New System.Net.NetworkCredential("root", "1234")) 22 req.Credentials = cache 23 'データをPOST送信するためのStreamを取得 24 Dim reqStream As System.IO.Stream = req.GetRequestStream() 25 '送信するデータを書き込む 26 reqStream.Write(postDataBytes, 0, postDataBytes.Length) 27 reqStream.Close() 28 reqStream.Dispose() 29 30 Dim sw As New System.Diagnostics.Stopwatch() 31 sw.Start() 32 33 'サーバーからの応答を受信するためのWebResponseを取得 34 Dim res As System.Net.WebResponse = req.GetResponse() ' この処理、2回目以降が遅いのはなぜ? 35 res.Close() 36 37 sw.Stop() 38 Console.WriteLine(sw.Elapsed) ' 時間を計測
試したこと
上記プログラムを動作させるごとに、機械が再起動します。
再起動するたびに連続で時間を計測しましたところ、
1回目: 00:00:00.3628999
2回目: 00:00:05.0039975
3回目: 00:00:05.0027223
という結果になりました。
ちなみに、機械側で「再接続時は5秒待つ」みたいな処理はさせていません。
また、十分に長い時間待ったあと(2分くらい?)、再度プログラムを実行すると、1回目と同じ時間で処理が終わります。
デバッグを一旦停止して、再度実行してからプログラムを実行すると、2分待たなくても1回目と同じ時間で処理が終わるので、明らかにGetResponse()の処理が原因だと思っています。
補足情報(FW/ツールのバージョンなど)
Windows 7(32bit)
Visual Studio 2017 Community
VB.NET
.NetFramework 4
回答1件
あなたの回答
tips
プレビュー