【问题标题】:“Hostname could not be parsed” From “ftp” [duplicate]“无法解析主机名”来自“ftp”[重复]
【发布时间】:2018-03-21 19:31:10
【问题描述】:

这里的代码给了我错误“{“无效的 URI:无法解析主机名。”}”

var downloadUri = ConfigurationManager.AppSettings["DownloadUri"];

FtpWebRequest FTPRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://" 
+ "user123" +
":" + "p@ssword" + "@" + downloadUri);

这里的 ftp 密码有一个 @ 字符,删除后可以继续这段代码。但是密码有一个@字符,所以我怎样才能使它工作?

【问题讨论】:

  • downloadUri 解析为什么?我的小实验程序也不喜欢 p@ssword 作为变量名。
  • 对不起@Filburt 我现在已经把它改成了字符串
  • @PhilNDeBlanc 下载 uri 只是服务器上存储一些文件的目录。如果我使用上述方法通过浏览器进行 ftp,它可以正常工作。 'ftp://'user123:p@ssword@downloadUri

标签: c# .net ftp


【解决方案1】:

您需要对@ 符号进行十六进制编码:

string encodedPassword = "p@ssword".Replace("@", "%40");

FtpWebRequest FTPRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://" 
    + "user123" +
    ":" + encodedPassword + "@" + downloadUri);

(在 Andrew 的建议下)如果你想捕捉更多的“专业”字符:

添加对System.Web 的引用并使用以下内容:

string encodedPassword = HttpUtility.UrlEncode("p@ssword");

FtpWebRequest FTPRequest = (FtpWebRequest)FtpWebRequest.Create("ftp://" 
    + "user123" +
    ":" + encodedPassword + "@" + downloadUri);

或者,甚至更好:

string userName = "user123";
string password = "p@ssword";
string ftpPath = string.Format("ftp://{0}:{1}@{2}", userName, password, downloadUri);

var ftpRequest = (FtpWebRequest)FtpWebRequest.Create(HttpUtility.UrlEncode(ftpPath));

【讨论】:

  • 我会使用 HttpUtility.UrlEncode 而不是硬编码该逻辑。如果密码还包含:/ 或任何其他有问题的字符怎么办?
  • @Andrew 这样做可能会更好,尽管需要 OP 引用 System.Web。目前尚不清楚在这种情况下UrlEncodeUrlPathEncode 是否会更好,因为它们的编码略有不同(例如,UrlEncode 中的空格是+,UrlPathEncode 中的%20)。
  • @Andrew WebUtility.UrlEncode()System.Net 中并输出相同的内容。
  • 对,显然它几乎相同,但编码总是大写:stackoverflow.com/a/21771206/2321042
猜你喜欢
  • 1970-01-01
  • 2022-06-16
  • 2017-03-26
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多