如果可以,在C#中使用FtpWebRequest实现FTP/SFTP,无需第三方dllFtpWebRequest类实现ftp/sftp,但直到现在都没有成功。我不想使用任何第3方免费或付费dll。凭据就像hostname=sftp.xyz.comuserid=abcpassword=123我可以使用IP地址进行ftp但无法使用凭据获取上述主机名的sftp。对于sftp,我已将FtpWebRequest类的EnableSsl属性设置为true,但出现无法连接到远程服务器的错误。我可以使用相同的凭据和主机名连接到Filezilla,但不能通过代码连接。我观察到filezilla,它在文本框中将主机名从sftp.xyz.com更改为sftp://sftp.xyz.com,在命令行中将用户ID更改为abc@sftp.xyz.com我在代码中做了同样的事情,但sftp没有成功。请紧急帮助。提前致谢。以下是我当前的代码:privatestaticvoidProcessSFTPFile(){try{string[]fileList=null;StringBuilder结果=newStringBuilder();stringuri="ftp://sftp.xyz.com";FtpWebRequestftpRequest=(FtpWebRequest)WebRequest.Create(newUri(uri));ftpRequest.Method=WebRequestMethods.Ftp.ListDirectoryDe??tails;ftpRequest.EnableSsl=true;ftpRequest.Credentials=newNetworkCredential("abc@sftp.xyz.com","123");ftpRequest.UsePassive=true;ftpRequest.Timeout=System.Threading.Timeout.Infinite;//ftpRequest.AuthenticationLevel=Security.AuthenticationLevel.MutualAuthRequested;//ftpRequest.Proxy=null;ftpRequest.KeepAlive=true;ftpRequest.UseBinary=true;//挂钩一个回调来验证远程证书ServicePointManager.ServerCertificateValidationCallback=newRemoteCertificateValidationCallback(ValidateServerCertificate);//ServicePointManager.ServerCertificateValidationCallback=((sender,certificate,chain,sslPolicyErrors)=>true);FtpWebResponse响应=(FtpWebResponse)ftpRequest.GetResponse();StreamReaderreader=newStreamReader(response.GetResponseStream());字符串行=reader.ReadLine();while(line!=null){result.Append("ftp://sftp.xyz.com"+line);结果。追加(“n”);line=reader.ReadLine();}if(result.Length!=0){//删除尾随的'n'result.Remove(result.ToString().LastIndexOf('n'),1);//提取所有ftp文件路径的数组fileList=result.ToString().Split('n');}}catch(Exceptionex){Console.WriteLine(ex.Message.ToString());控制台.ReadLine();}}publicstaticboolValidateServerCertificate(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorssslPolicyErrors){if(certificate.Subject.Contains("CN=sftp.xyz.com")){返回真;}else{返回错误;}}更新:如果使用BizTalk,则可以使用ESBToolkit使用SFTP适配器它自2010年起一直得到支持。有人想知道为什么它没有进入.NetFrameworkBizTalkServer2013:在ESB工具包SFTP中创建自定义适配器提供程序作为示例BizTalkServer2013:如何使用SFTP适配器MSDN文档-不幸的是,只有很多工作现在要做的是用框架来做。放置sftp协议前缀不足以使其正常工作仍然没有内置的.NetFramework支持,可能在将来。————————————————————-1)SSHNet是一个值得尝试的好库。————————————————————它具有:更多功能,包括内置流媒体支持。API文档一个更简单的API来编写代码文档中的示例代码:列表目录//////此示例将列出当前目录的内容。///publicvoidListDirectory(){stringhost="";字符串用户名=“”;字符串密码=“”;字符串remoteDirectory=".";//。总是指当前目录。使用(varsftp=newSftpClient(host,username,password)){sftp.Connect();var文件=sftp.ListDirectory(remoteDirectory);foreach(文件中的var文件){Console.WriteLine(file.FullName);}}}上传文件//////此示例将本地计算机上的文件上传到远程系统。///publicvoidUploadFile(){stringhost="";字符串用户名=“”;字符串密码=“”;字符串本地文件名="";字符串remoteFileName=System.IO.Path.GetFileName(localFile);使用(varsftp=newSftpClient(host,username,password)){sftp.Connect();使用(varfile=File.OpenRead(localFileName)){sftp.UploadFile(remoteFileName,file);}sftp.Disconnect();}}下载文件//////此示例将远程系统上的文件下载到您的本地计算机。///publicvoidDownloadFile(){stringhost="";字符串用户名=“”;字符串密码=“”;字符串localFileName=System.IO.Path.GetFileName(localFile);字符串remoteFileName="";使用(varsftp=newSftpClient(host,username,password)){sftp.Connect();使用(varfile=File.OpenWrite(localFileName)){sftp.DownloadFile(remoteFileName,file);}sftp.Disconnect();}}————————————————–————-2)另一个替代库是WinSCP————————————————–——-以下为示例:usingSystem;使用WinSCP;classExample{publicstaticintMain(){try{//设置会话选项SessionOptionssessionOptions=newSessionOptions{Protocol=Protocol.Sftp,HostName="example.com",UserName="user",Password="mypassword",SshHostKeyFingerprint="ssh-rsa2048xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"};using(Sessionsession=newSession()){//连接session.Open(sessionOptions);//上传文件TransferOptionstransferOptions=newTransferOptions();transferOptions.TransferMode=TransferMode.Binary;TransferOperationResulttransferResult;transferResult=session.PutFiles(@"d:toupload*","/home/user/",false,transferOptions);//抛出任何错误transferResult.Check();//打印每个结果(TransferEventArgstransferintransferResult.Transfers){Console.WriteLine("Uploadof{0}succeeded",transfer.FileName);}}return0;}catch(Exceptione){Console.WriteLine("Error:{0}",e);return1;}}}在这里发现更多FTP可以单独使用.NET完成。但是SFTP没有内置类。我建议查看WinSCP。同意Tejs。只是为了澄清:FtpWebRequestwithEnableSsl=true表示它是ftps,显式模式,或者用Filezilla的说法:“FTPES–FTPoverExplicitTLS/SSL,默认端口21”。您可以使用内置的.net工具来执行此操作。对于隐式ftps(在Filezilla中的措辞“FTPS-FTPoverImplicitTLS/SSL,defaultport990”)你必须使用第三方(例如ftps.codeplex.com)。对于sftp(在Filezilla中写入“SSH文件传输协议,默认端口22”),您还必须使用第三方(例如sshnet.codeplex.com)。正如JoachimIsaksson所说,如果你不能使用第三方,你必须自己实现它。以上就是C#学习教程:如果可以的话,在C#中使用FtpWebRequest,无需第三方dll即可实现FTP/SFTP共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
