550尝试通过远程服务器上C#中的FTP上载文件时出错
下面的代码在我们内部网络的服务器上运行时有效。当我更改凭据以反映网络之外的服务器时,我得到一个550错误的响应。当我捕捉到这样的异常时:550尝试通过远程服务器上C#中的FTP上载文件时出错,c#,.net,ftp,C#,.net,Ftp,下面的代码在我们内部网络的服务器上运行时有效。当我更改凭据以反映网络之外的服务器时,我得到一个550错误的响应。当我捕捉到这样的异常时: try { requestStream = request.GetRequestStream(); FtpWebResponse resp = (FtpWebResponse)request.GetResponse(); } catch(WebException e) { string status = ((FtpWebRespon
try {
requestStream = request.GetRequestStream();
FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
}
catch(WebException e) {
string status = ((FtpWebResponse)e.Response).StatusDescription;
throw e;
}
状态的值为:
“550命令存储失败\r\n”
我可以使用Filezilla这样的客户端使用相同的凭据成功上载文件。正如其他答案所建议的那样,我已经尝试过使用SetMethodRequiresCWD(),但这对我不起作用
下面是代码,它接收字符串列表,每个字符串都包含文件的完整路径
private void sendFilesViaFTP(List<string> fileNames) {
FtpWebRequest request = null;
string ftpEndPoint = "ftp://pathToServer/";
string fileNameOnly; //no path
Stream requestStream;
foreach(string each in fileNames){
fileNameOnly = each.Substring(each.LastIndexOf('\\') + 1);
request = (FtpWebRequest)WebRequest.Create(ftpEndPoint + fileNameOnly);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential("username", "password");
StreamReader fileToSend = new StreamReader(each);
byte[] fileContents = Encoding.UTF8.GetBytes(fileToSend.ReadToEnd()); //this is assuming the files are UTF-8 encoded, need to confirm
fileToSend.Close();
request.ContentLength = fileContents.Length;
requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); //validate this in some way?
response.Close();
}
}
private void sendFilesViaFTP(列出文件名){
FtpWebRequest请求=null;
字符串ftpEndPoint=”ftp://pathToServer/";
string FileName Only;//无路径
流请求流;
foreach(文件名中的每个字符串){
fileNameOnly=each.Substring(each.LastIndexOf('\\')+1);
request=(FtpWebRequest)WebRequest.Create(仅限ftpEndPoint+filename);
request.Method=WebRequestMethods.Ftp.UploadFile;
request.Credentials=新的网络凭据(“用户名”、“密码”);
StreamReader fileToSend=新的StreamReader(每个);
byte[]fileContents=Encoding.UTF8.GetBytes(fileToSend.ReadToEnd());//这是假设文件是UTF-8编码的,需要确认
fileToSend.Close();
request.ContentLength=fileContents.Length;
requestStream=request.GetRequestStream();
Write(fileContents,0,fileContents.Length);
requestStream.Close();
FtpWebResponse response=(FtpWebResponse)request.GetResponse();//是否以某种方式验证此操作?
response.Close();
}
}
我有一个非常类似的问题;出于某种原因,使用FtpWebRequest
要求我使用FTP服务器的凭据,以完全访问所有文件夹和子文件夹,而不仅仅是要保存到的文件夹
如果我继续使用其他凭证(在其他客户机上运行良好),我会反复出现550错误
我会尝试另一个拥有所有访问权限的FTP用户,看看是否有效。我无法使用FtpWebRequest解决此问题。我使用WebClient重新实现,如下所示,它生成了更简洁的代码,并具有工作的附带好处:
private void sendFilesViaFTP(List<string> fileNames){
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
foreach(string each in fileNames){
byte[] response = client.UploadFile("ftp://endpoint/" + each, "STOR", each);
string result = System.Text.Encoding.ASCII.GetString(response);
Console.Write(result);
}
}
private void sendFilesViaFTP(列出文件名){
WebClient客户端=新的WebClient();
client.Credentials=新的网络凭据(“用户名”、“密码”);
foreach(文件名中的每个字符串){
字节[]响应=client.UploadFile(“ftp://endpoint/“+每个,“STOR”,每个);
字符串结果=System.Text.Encoding.ASCII.GetString(响应);
控制台。写入(结果);
}
}
您检查路径了吗?错误550基本上是一个权限拒绝错误(没有这样的文件或文件夹)错误。此代码似乎是从该MSDN页面复制和粘贴的(尽管带有foreach调整)。正如@JunaidKirkire所提到的,关键在于细节——确保您的路径信息和配置都是正确的。我已经仔细检查了路径,它与我通过Filezilla连接时看到的路径相匹配。我还尝试将request.Method更改为WebRequestMethods.Ftp.ListDirectory(省略文件名以仅保留路径),这也会返回错误550。我并不是说这绝对不是问题所在,但我观察到的似乎不是问题所在。有没有可能有另一种解释?