【发布时间】:2019-11-05 10:08:47
【问题描述】:
我想知道这个 FtpWebRequest 是否出错,它会进入 catch 事件。我看过一个示例代码,他们在其中发布了我在 catch 事件中未注释的内容,以清理资源。
但我不知道在这种情况下这样做的正确方法是什么?我应该把所有这些都放在:= null;或者这是错误的做法?正确的做法是什么?
cleanUp(sourceStream, ref response, ref requestStream, ref request);
void uploadimage()
{
String sourceimage = "C:/ESD/image_2.jpg";
Task<bool> task = FtpUploadFile(sourceimage);
if (task.IsFaulted == false)
{
MessageBox.Show(task.Result.ToString());
}
}
private Task closeRequestStreamAsync(Stream requestStream) { return Task.Run(() => { requestStream.Close(); }); }
public async Task<bool> FtpUploadFile(string filename)
{
//if exception occurs we want to be able to close these
FtpWebResponse response = null;
FtpWebRequest request = null;
FileStream sourceStream = null;
Stream requestStream = null;
try
{
bool isimage = false; String ext = Path.GetExtension(filename);
if (ext == ".jpg" || ext == ".jpeg" || ext == ".png" || ext == ".gif" || ext == ".bmp") { isimage = true; }
request = (FtpWebRequest)WebRequest.Create("ftp://someurl.com/Folder1/test1.jpg");
request.UsePassive = true;
if (isimage == true) { request.UseBinary = true; } //for images
if (isimage == false) { request.UseBinary = false; } //for text
request.KeepAlive = true; //keep the connection open
request.Method = WebRequestMethods.Ftp.UploadFile;
request.ConnectionGroupName = "Group1";
request.ServicePoint.ConnectionLimit = 4;
//These are the credentials.
request.Credentials = new NetworkCredential("username", "password");
sourceStream = File.OpenRead(filename);
byte[] buffer = new byte[sourceStream.Length];
await sourceStream.ReadAsync(buffer, 0, buffer.Length);
sourceStream.Close();
requestStream = await request.GetRequestStreamAsync();
await requestStream.WriteAsync(buffer, 0, buffer.Length);
//MPM This is the call that takes the time
await closeRequestStreamAsync(requestStream);
//response = (FtpWebResponse)request.GetResponse();
WebResponse responseWeb = await request.GetResponseAsync();
response = (FtpWebResponse)responseWeb;
if (response.StatusDescription.Contains("226"))
{
//This means that we successfully have uploaded the file!
}
response.Close();
return true;
}
catch (Exception ex)
{
string errMSG = string.Format("Upload File failed, exception: {0}", ex.Message);
//cleanUp(sourceStream, ref response, ref requestStream, ref request);
return false;
}
}
【问题讨论】:
-
不要在方法开始时声明变量。这是一个非常糟糕的做法,给了他们比他们需要的更大的范围,并使代码更难阅读。仅在需要时声明变量,最好在定义时为其赋值。至于FtpWebRequest,在
using块内声明变量,例如using (var FtpWebRequest)WebRequest.Create(..){ ....}。这样可以确保即使发生异常也会释放该值。 -
也不要只吞下异常。要么处理它们,要么让它们传播给任何可以决定如何处理它们的人。如果请求失败,调用者会做什么?
true/false结果是什么意思?授权错误? DNS错误?还有什么? -
BTW 流也需要关闭。
sourceStream和responseStream也应该在using块中声明 -
这是一个好主意,可以在发生异常时使用它来处理它们。我试图声明这一点,但它似乎不正确?:
using (FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://someurl.com/Folder1/test1.jpg"){ } -
打错字了。
标签: c# ftpwebrequest