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

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

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

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2231閲覧

WebRequestのGetResponse()が二回目以降の呼び出しが遅い

takey

総合スコア312

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/06/14 02:49

編集2018/06/14 03:50

前提・実現したいこと

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

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

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

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

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

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

umyu

2018/06/14 04:10

Insomniaなどのリクエストツールを使って、プログラムと同じPOSTリクエストを発行しても、5秒待たないことを確認してみてくださいな。
takey

2018/06/14 08:47

Insomniaは64bit Onlyなのでインストールできませんでした
guest

回答1

0

自己解決

自己解決ではありませんが、大体わかりましたので閉じます。

上記のコードで、適当なhttpのWEBサイトにアクセスすると、2回目以降もスムーズにアクセスできました。

やはり、機械がレスポンスを返さないのが原因っぽいです。
Close()やDispose()すればリソースを開放するので問題ないと思ったのですが、そうはいかないようです。

GetResponse()がレスポンス(受信)待ちをする以上、これ以上の改善は無理そうなので、別の方法を探すことにします。

ありがとうございました。

投稿2018/06/14 08:52

takey

総合スコア312

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問