ファイルを FTP にアップロードする C# コード (スケジュールされた SSIS ジョブの一部) があります。ファイルはすでに FTP サイトに存在するため、ジョブは新しいバージョンで上書きするだけです。
ほとんどの場合、うまく機能しますが、数週間ごとに機能しなくなります。最近これが発生したとき、最初のエラーは「427 Aborted、file write error」であることがわかりました。また、「451、処理中にローカル エラーが発生しました」というメッセージが表示されることもあります。最初の失敗の後、その後ジョブが実行を試みるたびに、「550 File Unavailable」が返されます。このエラーが発生した後に Filezilla を使用してサイトを開くと、ターゲット ファイルは存在するが空であることがわかります。Filezilla を使用して空のファイルを削除すると、ジョブが再び機能し始めます。
最初に問題のファイルを削除してから、回避策として機能することを期待して新しいファイルをアップロードするようにコードを変更しました。このエラーを再現できなかったので、回避策が役立つかどうかは時間がわかります.
そうは言っても、根本的な原因を突き止めたいと思います。427 エラーに関する情報はほとんど見つかりませんでした。誰でもそれを回避する方法やより良い回避策のアイデアを知っていますか?
注: FTP サーバーは独自のものであり、ユーザー名、パスワード、およびポート以外はあまり制御できません。
私のコードは以下のとおりです(簡潔にするために編集されています)...
private void CreateFile(FtpWebRequest request, FtpWebResponse response, string ipAddress, Int16 port, string folderName, string username, string password)
{
string filename = "myfile.csv";
request = (FtpWebRequest)FtpWebRequest.Create(string.Format("ftp://{0}:{1}/{2}/{3}", ipAddress, port, folderName, filename));
request.KeepAlive = false;
request.Credentials = new System.Net.NetworkCredential(username, password);
request.Proxy = null;
request.UsePassive = false;
request.Method = WebRequestMethods.Ftp.DeleteFile;
request.GetResponse();
request = (FtpWebRequest)FtpWebRequest.Create(string.Format("ftp://{0}:{1}/{2}/{3}", ipAddress, port, folderName, filename));
request.KeepAlive = false;
request.Credentials = new System.Net.NetworkCredential(username, password);
request.Proxy = null;
request.UsePassive = false;
request.Method = WebRequestMethods.Ftp.UploadFile;
using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
{
DataTable myList = new DataTable();
System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter();
da.Fill(myList, Dts.Variables["MyList"].Value);
foreach (DataRow row in myList.Rows)
{
sw.WriteLine(row["col1"]);
}
sw.Flush();
}
}