读书人

C# 关于一个FTP连接有关问题

发布时间: 2013-12-02 12:00:40 作者: rapoo

C# 关于一个FTP连接问题
问题描述如下:
C# 关于一个FTP连接有关问题
如图,输入FTP服务器IP地址,FTP登录名,FTP登录密码。假设三者正确的登录信息为[192.168.1.8,myusername,mypassword]。
第一次输入正确的三者信息[192.168.1.8,myusername,mypassword],点设置按钮,反馈回来连接成功;
然后我故意输入错的登录名[192.168.1.8,myusername1,mypassword],反馈回来连接失败。
接着我修改登录名为正确用户名,并故意输入错的登录密码[192.168.1.8,myusername,mypassword1],反馈回来的结果是连接成功。
我的代码可以动态读取用户名信息,但密码一旦登录成功则就一直不变了,我的需求就是第一次登录成功后,接着修改登录密码为错的登录密码后,就不允许登录成功。


//声明全局变量
private string ftpUristring = null;
private NetworkCredential networkCredential;
private string currentDir = "/";
//设置按钮事件
private void setBtn_Click(object sender, EventArgs e)
{
try
{
if (FTPIpTxt.Text == string.Empty || FTPUsernameTxt.Text == string.Empty)
{
MessageBox.Show("FTP服务器IP或者用户名不能为空", "提示");
return;
}
ftpUristring = "ftp://" + FTPIpTxt.Text;
networkCredential = new NetworkCredential(FTPUsernameTxt.Text, FTPPasswordTxt.Text);
if (ShowFtpFileAndDirectory() == true)
{
listReports.Enabled = true;
listStatus.Enabled = true;
loginStatusLabel.Visible = true;
loginStatusLabel.Text = "登录成功";
}
else
{
listStatus.Enabled = true;
loginStatusLabel.Visible = true;
loginStatusLabel.Text = "登录失败";
}
}
catch(Exception ex)
{ MessageBox.Show(ex.Message); }
}
// 定义布尔函数ShowFtpFileAndDirectory,处理FTP连接并显示资源列表,如果返回正确的服务器回应信息,则传递true值到button事件,如果FTP连接失败返回错误的服务器回应信息,则传递false值到button事件
private bool ShowFtpFileAndDirectory()
{
listReports.Items.Clear();
string uri = string.Empty;
if (currentDir == "/")
{
uri = ftpUristring;
}
else
{
uri = ftpUristring + currentDir;
}
string[] urifield = uri.Split(' ');
uri = urifield[0];
FtpWebRequest request= CreateFtpWebRequest(uri, WebRequestMethods.Ftp.ListDirectoryDetails);

// 获得服务器返回的响应信息


FtpWebResponse response = GetFtpResponse(request);
if (response == null)
{
return false;
}
listStatus.Items.Add("连接成功,服务器返回的是:" + response.StatusCode + " " + response.StatusDescription);

// 读取网络流数据
Stream stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream, Encoding.Default);
listStatus.Items.Add("获取响应流....");
string s = streamReader.ReadToEnd();
streamReader.Close();
stream.Close();
response.Close();
listStatus.Items.Add("传输完成");
// 处理并显示文件目录列表
string[] ftpdir = s.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
listReports.Items.Add("↑返回上层目录");
int length = 0;
for (int i = 0; i < ftpdir.Length; i++)
{
if (ftpdir[i].EndsWith("."))
{
length = ftpdir[i].Length - 2;
break;
}
}
for (int i = 0; i < ftpdir.Length; i++)
{
s = ftpdir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (length < s.Length)
{
index = length;
}
else
{
continue;
}
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
{
continue;
}
// 判断是否为目录,在名称前加"目录"来表示
if (s[0] == 'd' || (s.ToLower()).Contains("<dir>"))


{
string[] namefield = name.Split(' ');
int namefieldlength = namefield.Length;
string dirname;
dirname = namefield[namefieldlength - 1];

// 对齐
dirname = dirname.PadRight(34, ' ');
name = dirname;
// 显示目录
listReports.Items.Add("[目录]" + name);
}
}

for (int i = 0; i < ftpdir.Length; i++)
{
s = ftpdir[i];
int index = s.LastIndexOf('\t');
if (index == -1)
{
if (length < s.Length)
{
index = length;
}
else
{
continue;
}
}
string name = s.Substring(index + 1);
if (name == "." || name == "..")
{
continue;
}
// 判断是否为文件
if (!(s[0] == 'd' || (s.ToLower()).Contains("<dir>")))
{
string[] namefield = name.Split(' ');
int namefieldlength = namefield.Length;
string filename;
filename = namefield[namefieldlength - 1];
// 对齐
filename = filename.PadRight(34, ' ');
name = filename;
// 显示文件


listReports.Items.Add(name);
}
}
return true;
}
// 创建FTP连接
//我觉得问题出在这里,正确登录过一次之后,无论后来怎么修改密码,点设置,都可以成功登录,貌似正确密码缓存到了某个地方没有被清空
private FtpWebRequest CreateFtpWebRequest(string uri, string requestMethod)
{
FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri);
request.Credentials = networkCredential;
request.KeepAlive = true;
request.UseBinary = true;
request.Method = requestMethod;
return request;
}
// 获取服务器返回的响应体
private FtpWebResponse GetFtpResponse(FtpWebRequest request)
{
FtpWebResponse response = null;
try
{
response = (FtpWebResponse)request.GetResponse();
listStatus.Items.Add("验证完毕,服务器回应信息:[" + response.WelcomeMessage + "]");
listStatus.Items.Add("正在连接:[ " + response.BannerMessage + "]");
listStatus.TopIndex = listStatus.Items.Count - 1;
return response;
}
catch (WebException ex)
{
listStatus.Items.Add("发送错误。返回信息为:" + ex.Status);
listStatus.TopIndex = listStatus.Items.Count - 1;
return null;
}
}

FTP连接
[解决办法]
这个要看FTP服务器是怎么登录的 是匿名登录 还其它的
[解决办法]
好像木有完全理解你的想法。
[解决办法]
如果你没有退出登录,第二次连接是不需要提供用户凭据的,也就是说你提供的密码是不起任何作用,不会验证,除非你先退出登录。
FtpWebRequest.KeepAlive 属性默认值是true,意思是当你Close后也保持连接,下次请求不需要验证用户(除非更换用户名)。你可以改为false,但这样效率会降低。

读书人网 >C#

热点推荐