Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
550尝试通过远程服务器上C#中的FTP上载文件时出错_C#_.net_Ftp - Fatal编程技术网

550尝试通过远程服务器上C#中的FTP上载文件时出错

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

下面的代码在我们内部网络的服务器上运行时有效。当我更改凭据以反映网络之外的服务器时,我得到一个550错误的响应。当我捕捉到这样的异常时:

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。我并不是说这绝对不是问题所在,但我观察到的似乎不是问题所在。有没有可能有另一种解释?