|   | 
 
|  
 .NET TIPS 
FTPでエラーが発生した場合に生のメッセージを取得するには?[2.0のみ、C#、VB]
デジタルアドバンテージ 遠藤 孝信 
2006/06/23 | 
  | 
 
 
 
 | 
 「TIPS:WebRequest/WebResponseクラスでFTPによりファイル転送を行うには?」で示した方法によりFTPでファイル転送を行っていてFTPサーバでエラーが発生した場合には、WebRequestクラスのGetResponseメソッドなどで例外が発生する(記事中では省略しているが通常はtry-catch構文による例外処理を実装すべきだ)。
 このとき、どのような内容のエラーが発生したかは例外オブジェクト(Exceptionクラス(System名前空間)、あるいはその派生クラスのオブジェクト)のMessageプロパティから知ることができるのだが、FTPの場合には.NET FrameworkがFTPサーバから返されたエラー内容を汎用的なメッセージに置き換えてしまい、エラーの内容が分かりにくい場合がある。
分かりにくいFTPのエラー・メッセージ
 例えば次のサンプル・プログラムは、あるFTPサーバのあるディレクトリ配下に新しいディレクトリを3回作成しようとして、2回目と3回目がエラーになる例だ。
 
// ftpstatus.cs 
 
using System; 
using System.Net; 
 
class FtpStatus { 
  static void Main() { 
 
    string url; 
    string id = "user01"; 
    string pw = "mypassword"; 
 
    // /uploadは書き込み可能なディレクトリであるとする 
    url = "ftp://servername/upload/mynewdir"; 
    FtpMakeDir(url, id, pw); // 成功 
 
    // 再度同じディレクトリを作成 
    url = "ftp://servername/upload/mynewdir"; 
    FtpMakeDir(url, id, pw); // 失敗 
 
    // /usrはアクセス権のないディレクトリであるとする 
    url = "ftp://servername/usr/mynewdir"; 
    FtpMakeDir(url, id, pw); // 失敗 
  } 
 
  static void FtpMakeDir(string url, string id, string pw) { 
    WebRequest req = WebRequest.Create(url); 
    req.Credentials = new NetworkCredential(id, pw); 
    req.Method = WebRequestMethods.Ftp.MakeDirectory; 
 
    try { 
      WebResponse res = req.GetResponse(); 
    } catch (WebException e) { 
      Console.WriteLine(e.Message); 
    } 
  } 
} 
 
// コンパイル方法:ftpstatus.cs 
 | 
 
 
 | 
| FTPでディレクトリを作成しようとしてエラーとなるC#のサンプル・プログラム(ftpstatus.cs) | 
 | 
 
' ftpstatus.vb 
 
Imports System 
Imports System.Net 
 
Class FtpStatus 
  Shared Sub main() 
    Dim url As String 
    Dim id As String = "user01" 
    Dim pw As String = "mypassword" 
 
    ' /uploadは書き込み可能なディレクトリであるとする 
    url = "ftp://servername/upload/mynewdir" 
    FtpMakeDir(url, id, pw) ' 成功 
 
    ' 再度同じディレクトリを作成 
    url = "ftp://servername/upload/mynewdir" 
    FtpMakeDir(url, id, pw) ' 失敗 
 
    ' /usrはアクセス権のないディレクトリであるとする 
    url = "ftp://servername/usr/mynewdir" 
    FtpMakeDir(url, id, pw) '失敗 
  End Sub 
 
  Shared Sub FtpMakeDir(ByVal url As String, ByVal id As String, ByVal pw As String) 
    Dim req As WebRequest = WebRequest.Create(url) 
    req.Credentials = New NetworkCredential(id, pw) 
    req.Method = WebRequestMethods.Ftp.MakeDirectory 
 
    Try 
      Dim res As WebResponse = req.GetResponse() 
    Catch e As WebException 
      Console.WriteLine(e.Message) 
    End Try 
  End Sub 
End Class 
 
' コンパイル方法:vbc ftpstatus.vb 
 | 
 
 
 | 
| FTPでディレクトリを作成しようとしてエラーとなるVBのサンプル・プログラム(ftpstatus.vb) | 
 | 
 ここでWebExceptionクラス(System.Net名前空間)は、WebRequest/WebResponseクラス(あるいはそれらの派生クラス)で発生する例外のクラスである。
 このプログラムでは、2回目はすでに同名のディレクトリが存在するため、3回目はディレクトリにアクセス権がないためにエラーとなるのだが、どちらの場合も画面に表示されるe.Messageの内容は次のようになる。
 
リモート サーバーがエラーを返しました: (550) ファイルが使用できません (例: ファイルが見つからない、ファイルへのアクセスがない) 
 | 
 
 
 | 
| 上記サンプル・プログラムで表示されるエラー・メッセージ | 
 「550」はFTPのステータス・コード(レスポンス・コードと呼ばれる場合もある)を示すものだが*、.NET Frameworkのエラー・メッセージはステータス・コードのみにより決められているようだ。
生のメッセージを含むStatusDescriptionプロパティ
 しかしたいていのFTPサーバでは、例えば同じ550番でも実際にはよりエラー内容に即したメッセージを返しており、そのメッセージを見るとエラーの原因が分かりやすい。
 そのようなFTPサーバからの生のメッセージは、FtpWebResponseオブジェクトのStatusDescriptionプロパティから取得することができる。
 また、WebException例外がFTPによるファイル転送時に発生した場合には、そのResponseプロパティにはFTPサーバからのレスポンスを示すFtpWebResponseオブジェクトがセットされている。
 従って、上記のFtpMakeDirメソッドを以下のように修正すれば、エラー発生時にFTPサーバが返す生のメッセージを表示させることができる。
 
static void FtpMakeDir(string url, string id, string pw) { 
  WebRequest req = WebRequest.Create(url); 
  req.Credentials = new NetworkCredential(id, pw); 
  req.Method = WebRequestMethods.Ftp.MakeDirectory; 
 
  try { 
    WebResponse res = req.GetResponse(); 
  } catch (WebException e) { 
    FtpWebResponse res = (FtpWebResponse)e.Response; 
    Console.WriteLine(res.StatusDescription); 
  } 
} 
 | 
 
 
 
Shared Sub FtpMakeDir(ByVal url As String, ByVal id As String, ByVal pw As String) 
  Dim req As WebRequest = WebRequest.Create(url) 
  req.Credentials = New NetworkCredential(id, pw) 
  req.Method = WebRequestMethods.Ftp.MakeDirectory 
 
  Try 
    Dim res As WebResponse = req.GetResponse() 
  Catch e As WebException 
    Dim res As FtpWebResponse = CType(e.Response, FtpWebResponse) 
    Console.WriteLine(res.StatusDescription) 
  End Try 
End Sub 
 | 
 
 
 | 
| エラー時にFTPサーバが返した生のメッセージを表示するFtpMakeDirメソッド(上:C#、下:VB) | 
 こちらのメソッドを使うと、筆者が試したFTPサーバでは2回目、3回目のエラー・メッセージはそれぞれ以下のような内容だった。
 
550 Permission denied to "mynewdir". 
 | 
 
 
 | 
| 2回目のエラー・メッセージ | 
 
550 "/usr/": Access denied. 
 | 
 
 
 | 
| 3回目のエラー・メッセージ | 
 使用するFTPサーバによりメッセージ内容が変わってしまう、FTPサーバによってはメッセージが日本語でないなどの欠点はあるが、エラーの原因を探るには有用だろう。
 
利用可能バージョン:.NET Framework 2.0のみ 
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク 
使用ライブラリ:WebRequestクラス(System.Net名前空間) 
使用ライブラリ:WebResponseクラス(System.Net名前空間) 
使用ライブラリ:NetworkCredentialクラス(System.Net名前空間) 
関連TIPS:WebRequest/WebResponseクラスでFTPによりファイル転送を行うには?
 | 
 
|  
 | 
 
generated by  
 | 
 
 
 | 
 
 
	
		Insider.NET 記事ランキング
		
		
			本日
			月間