C# &引用;无法分析主机名";从「;ftp“;统一资源定位地址

C# &引用;无法分析主机名";从「;ftp“;统一资源定位地址,c#,C#,我刚从GoDaddy那里购买了一些在线存储设备,并试图通过FTP将其发送到我的存储帐户中。问题是,我可以使用FileZilla查看和修改我的帐户,但我的C Sharp程序甚至不会访问它,因为“主机名无法解析”错误 我相信这是因为我帐户的整个ftp地址在url中有两个“@”符号,这对URI创建过程造成了极大的破坏 有什么办法可以绕过这个问题吗?还是因为GoDaddy存储的命名约定,我就完蛋了 URL为:ftp:[slashslash]lastname。firstname@gmail.com@onl

我刚从GoDaddy那里购买了一些在线存储设备,并试图通过FTP将其发送到我的存储帐户中。问题是,我可以使用FileZilla查看和修改我的帐户,但我的C Sharp程序甚至不会访问它,因为“主机名无法解析”错误

我相信这是因为我帐户的整个ftp地址在url中有两个“@”符号,这对URI创建过程造成了极大的破坏

有什么办法可以绕过这个问题吗?还是因为GoDaddy存储的命名约定,我就完蛋了


URL为:ftp:[slashslash]lastname。firstname@gmail.com@onlinefilefolder.com/Home/

异常源于
System.Uri
,它(尽管标准定义可以接受)不允许使用两个
@
符号

// This will reproduce the reported exception, I assume it is what your code is
// doing either explicitly, or somewhere internally
new Uri(@"ftp://lastname.firstname@gmail.com@onlinefilefolder.com/Home/")
一个潜在的解决方法是对第一个
@
符号进行百分比编码,这将允许对
Uri
实例进行实例化,但根据服务器的行为,可能会或可能不会工作(我只使用过几次这种方法,但它对我有效):


出于某种特定原因,是否需要在URI中指定用户名和密码?您只需连接到主机,然后提供凭据即可

// Create a request to the host
var request = (FtpWebRequest)WebRequest.Create("ftp://onlinefilefolder.com");

// Set the username and password to use
request.Credentials = new NetworkCredential ("lastname.firstname@gmail.com","password");

request.Method = WebRequestMethods.Ftp.UploadFile;

var sourceStream = new StreamReader("testfile.txt");
var fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();

FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

response.Close();

你到底想干什么?您有任何示例代码吗?您要传递的godaddy主机名的格式到底是什么?URL是:URI可以有
@
它是一个保留的分隔符。似乎你的解析器不太好。你能添加一些可以查看/调试的代码吗?你的建议已经阻止了错误,我的程序甚至“成功”上传到我的在线存储帐户,但每当我带着FileZilla去那里时,文件实际上并不在那里。似乎百分比编码对我来说不是一个可行的选择。
// Create a request to the host
var request = (FtpWebRequest)WebRequest.Create("ftp://onlinefilefolder.com");

// Set the username and password to use
request.Credentials = new NetworkCredential ("lastname.firstname@gmail.com","password");

request.Method = WebRequestMethods.Ftp.UploadFile;

var sourceStream = new StreamReader("testfile.txt");
var fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;

Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();

FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);

response.Close();