【问题标题】:Send file FTP over SSL with custom port number使用自定义端口号通过 SSL 发送文件 FTP
【发布时间】:2011-11-21 18:50:13
【问题描述】:

我想通过带有自定义端口号的 ssl 或带有隐式 SSL 的 FTP 将文件上传和下载到 FTP。 我为此使用.net ftpwebrequest & ftpwebresponse 方法。 这是我的代码:

Dim reqObj As FtpWebRequest = CType(WebRequest.Create(_Url + filename), FtpWebRequest) 
reqObj.Method = WebRequestMethods.Ftp.UploadFile 
reqObj.KeepAlive = False 
If _IsSSLEnable Then 
reqObj.UseBinary = True 
End If 
reqObj.Credentials = New NetworkCredential(_UserName, _Password) 
If _IsSSLEnable Then 
reqObj.EnableSsl = _IsSSLEnable Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf validateCert  
End If 
Dim streamResponse As Stream 
streamResponse = reqObj.GetRequestStream() 

在此之后我收到错误...

服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同。

但是如果我添加

reqObj.UsePassive = False

它给了我错误:

操作已超时

这适用于普通 ftp 和 ssl 上的 ftp,但不适用于自定义端口号或隐式 ssl。

你能告诉我.net 是否支持这个?

或者我必须为这种情况使用其他方法

谢谢,

赫曼特

【问题讨论】:

  • Hemant 请编辑您的问题,显示您的代码和错误详细信息。这里没有水晶球 ;-)
  • @Davide 感谢您的回复。这是我的代码 ::: Dim reqObj As FtpWebRequest = CType(WebRequest.Create(_Url + filename), FtpWebRequest) reqObj.Method = WebRequestMethods.Ftp.UploadFile reqObj .KeepAlive = False If _IsSSLEnable Then reqObj.UseBinary = True End If reqObj.Credentials = New NetworkCredential(_UserName, _Password) If _IsSSLEnable Then reqObj.EnableSsl = _IsSSLEnable Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf validateCert 'callback End If Dim streamResponse As Stream streamResponse = reqObj.GetRequestStream()
  • 编辑问题,将代码放入问题中,格式与代码一样好
  • @DavidePiras 感谢您的回复。我已经改变了问题。
  • 快速谷歌搜索显示不。FtpWebRequest 不支持隐式 SSL。至于端口,我们使用21,所以我在构建URI(使用UriBuilder)创建FtpWebRequest时将其设置为21。 stackoverflow.com/questions/1842186/…

标签: .net vb.net ssl ftp


【解决方案1】:

SO 上已经有一个非常相似的问题:Set Port number when using FtpWebRequest in C#

看起来解决方案是这样的:

yourFtpWebRequest.UsePassive = false;

但请查看该问题和答案以了解更多详细信息。

【讨论】:

  • 感谢您的回复。我已经完成了更改,但我的问题没有解决。就我而言,不同之处在于,当我尝试通过 FileZilla 连接时,它连接到特定端口而不是端口 21。谢谢,Hemant
  • 对于一个通过 ssl 的 Ftp,它也会给我这个错误。在此没有特定的端口。服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同。
  • 您是如何创建请求的?你应该这样做: FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftps://[host]:[PortNumber]/[filename.ext]"); ...
  • Dim request As FtpWebRequest = CType(WebRequest.Create("ftps://[Host}:[port]/" + filename), FtpWebRequest) 它给了我错误:无法识别 URI 前缀.但是如果我尝试使用 Dim request As FtpWebRequest = CType(WebRequest.Create("ftp://[Host}:[port]/" + filename), FtpWebRequest) 意味着没有 ftps 它会给我错误:底层连接已关闭:服务器违反了协议
  • 非常感谢!它解决了我的问题。这将取决于机器之间的防火墙。我注意到,如果我通过我们的防火墙,我需要将其保留为 true,否则它将返回异常:“远程服务器返回错误:(500) 语法错误,命令无法识别。”但是,如果我在防火墙后面(例如在数据中心内直接相互连接的两台机器),那么我需要将其设置为 false,否则它将返回异常:“服务器返回一个地址以响应PASV 命令与建立 FTP 连接的地址不同。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2021-01-09
  • 1970-01-01
  • 2016-04-25
  • 2016-01-03
  • 1970-01-01
  • 2018-04-08
相关资源
最近更新 更多