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

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

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

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

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

VB.NET

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

Q&A

解決済

2回答

8360閲覧

ftpサーバがダウンしている時にSystem.Net.WebClient.DownloadFileからの返答が遅い

toro1

総合スコア90

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

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

VB.NET

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

0グッド

1クリップ

投稿2017/09/21 01:50

編集2017/09/21 02:15

今、ftpサーバからデータをダウンロードするプログラムを作成しています。
この時、ftpサーバが生存している場合は良いのですが、ftpサーバがダウンしている時に
System.Net.WebClient.DownloadFileを実行すると例外発生するのですが、このレスポンスが遅いです。
非同期を使えない場合で、このレスポンスを早く返す方法があるでしょうか?

vb.net

1Private ftpurl As String = "ftp://xxx.xxx.xxx.xxx/abcdef/xxx.zip" 2Private ftpuser As String = "xxxxxx" 3Private ftppass As String = "xxxx" 4 5 Public Sub Download() 6 Try 7 Dim wc As New System.Net.WebClient() 8 9 If ftpurl.Contains("ftp://") Then 10 wc.Credentials = New Net.NetworkCredential(ftpuser, ftppass) 11 End If 12 13 wc.DownloadFile(ftpurl, filepath) 'サーバダウン時、ここのレスポンスが遅い 14 15 Catch 16 Throw 17 End Try 18 19 End Sub

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

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

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

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

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

guest

回答2

0

自己解決

自己解決できました。
どうも、kikukiku様にご回答して頂いたTimeoutプロパティは、ftpサーバとの接続ができてからのタイムアウト値みたいなので、サーバの生存確認としてpingを実行することにして、解決を図りました。

ただし、条件としてサーバがping応答を返すという条件がついてしまいますが。(注意 追記参照)


追記
どうも、プライベートipアドレスを指定した時のみレスポンスが遅いみたいです。
例1(ホスト名) ftp://www.xxxx.com/ ⇒ レスポンスが早い 
例2(グローバルIPアドレス) ftp://200.100.xxx.xxx/ ⇒レスポンスが早い
例3(プライベートIPアドレス) ftp://192.168.xxx.xxx/ ⇒ レスポンスが遅い 

テストでは、プライベートIPアドレスを使っていましたが、本番はホスト名を指定する予定なので、
今回の問題は、pingを使用しなくても解消しそうです。

なぜプライベートIPアドレスだけ遅いのかは謎ですが。

vb.net

1Private ftpurl As String = "ftp://xxx.xxx.xxx.xxx/abcdef/xxx.zip" 2Private ftpuser As String = "xxxxxx" 3Private ftppass As String = "xxxx" 4 5Public Sub Download() 6 Try 7 8 'pingでサーバの生存確認 9 Dim url As New Uri(ftpurl) 10 Dim p As New System.Net.NetworkInformation.Ping 11 Dim reply As System.Net.NetworkInformation.PingReply = p.Send(url.GetLeftPart(UriPartial.Authority).Replace(url.GetLeftPart(UriPartial.Scheme), "")) 'ping xxx.xxx.xxx.xxx 12 If reply.Status <> Net.NetworkInformation.IPStatus.Success Then Throw New Net.WebException("pingを実行しましたが応答しません。") 13 14 Dim wc As New System.Net.WebClient() 15 If ftpurl.Contains("ftp://") Then 16 wc.Credentials = New Net.NetworkCredential(ftpuser, ftppass) 17 End If 18 19 wc.DownloadFile(ftpurl, filepath) 'サーバダウン時、ここのレスポンスが遅い 20 21 Catch 22 Throw 23 End Try 24 25End Sub

投稿2017/09/21 07:53

編集2017/09/21 08:50
toro1

総合スコア90

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

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

0

検証はしていないのでわかりませんが、
下記のプロパティで制御できないでしょうか?

WebRequest.Timeoutプロパティ
https://msdn.microsoft.com/ja-jp/library/system.net.webrequest.timeout(v=vs.110).aspx

投稿2017/09/21 01:58

kikukiku

総合スコア514

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

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

toro1

2017/09/21 02:16 編集

回答ありがとうございます。 今回、使用しているSystem.Net.WebClientには、Timeoutのプロパティは、無いみたいです。 できれば、System.Net.WebClientを使用したいのですが、WebRequestでもできるどうか調査してみようと思います。
toro1

2017/09/21 03:47 編集

返答ありがとうございます。 記事を参考に組み込んで、サーバがダウンしている場合で確認したのですが、Timeoutを短く設定しても、レスポンスは変わりませんでした。(レスポンスは、約20秒くらい) 実験してみての推測ですが、このTimeoutプロパティは、サーバに接続された後のTimeout値なのかもしれません。
kikukiku

2017/09/21 04:37

はずれでしたか、申し訳ないです。HttpWebRequest.ReadWriteTimeoutも見つけましたがデフォルトが5分なのでたぶん違うと思います。あとはWebClientだとtimeoutが効かないとかあるのかなー。WebClientを使わずにHttpWebRequestを使ってtimeoutが効くかどうかでしょうか?それでも駄目だったら、スレッド化してアプリでタイムアウト機能を作る感じでしょうか。
toro1

2017/09/21 08:00

返答ありがとうございます。 >WebClientだとtimeoutが効かないとかあるのかな サーバがダウンしていない時にtimeout値を極端に少なくした場合、例外を返したのでtimeout自体は効いていると思います。 webrequestでも実装してみましたが、やはり、レスポンスが20秒くらいかかりました。このTimeoutのプロパティも、ftpサーバ接続後のタイムアウト値みたいです。 今回は、とりあえず、ping応答を返すftpサーバだったので、pingで生存確認を行ってから処理を行うようにしました。
toro1

2017/09/21 08:49 編集

どうもプライベートipアドレスを指定した時のみレスポンスが遅いみたいです。 例1(ホスト名) ftp://www.xxxx.com/ ⇒ レスポンスが早い  例2(グローバルIPアドレス) ftp://200.100.xxx.xxx/ ⇒レスポンスが早い 例3(プライベートIPアドレス) ftp://192.168.xxx.xxx/ ⇒ レスポンスが遅い  テストでは、プライベートIPアドレスを使っていましたが、本番はホスト名を指定する予定なので、 今回の問題は、pingを使用しなくても解消しそうです。 kikukiku様、情報提供ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問