2014-09-04 124 views
0

我有一个MVC应用程序,并试图访问我在IIS中设置的本地主机ftp服务器 - 最终它将访问其他ftp服务器,但我只想在本地尝试。我使用FtpWebRequest编写了一个c#函数,但是当我调用GetResponse()时,它会返回错误:“远程服务器返回错误:(530)Not logged in。”不确定如何以匿名或非匿名用户身份登录。如果我在IIS中有一个名为“MyFTPSite”的FTP站点并启用了匿名身份验证,那么URL字符串的格式是否正确?网络创新应该是什么? Files目录是ftproot的子项 - 我需要为Files文件夹添加一个虚拟目录吗?现在,ftp站点的物理路径被设置为C:\ inetpub \ ftproot。 (在下面的代码中,localhost故意拼写错误的b/c该网站不希望我使用本地主机url)。通过.Net访问本地主机FTP服务器

public override bool DownloadFile() 
    { 
     string fileName = System.IO.Path.GetFileName(this.UrlString); 

     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(this.UrlString); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 

     //anonymous logon 
     request.Credentials = new NetworkCredential("anonymous", "<my email>"); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     response.Close(); 
     return true; 

    } 

FTPDownload download = new FTPDownload(@"ftp://lclhost/MyFTPSite/Files/w4.pdf"); 
download.DownloadFile(); 

回答

0

您的代码看起来可能是罚款—更可能的,你可以通过修改IIS FTP服务器的设置解决这个问题。

首先,一些想法,以获得一个基地已知的配置。

  1. 打开IIS管理器工具。
  2. 让我们确保您仍然有IUSR作为IIS在其内部安全方案中使用匿名身份验证的用户。点击左侧边栏的顶部节点(应该是您的计算机名称),然后点击主内容区域中IIS部分的Authentication。确保已启用Anonymous Authentication。点击此项目,然后点击右侧边栏中的Edit。确保它已被设置为Specific User,值为IUSR。只要是这种情况,我们不需要处理IUSR密码等。
  3. 点击左侧边栏中的FTP站点。
  4. 在右侧边栏中,点击Basic Settings。记下网站指向的目录 - 例如。 C:\inetpub\ftproot,并确保这与您的代码试图下载的测试文件的预期位置相匹配。
  5. 在右侧边栏中点击Bindings。由于您的代码没有提及特定的端口,请确保在此设置端口21。至于IP Address,将其设置为All Unassigned应该没问题,或者你可以设置为'127.0.0.1'。
  6. 在主窗口区域,我们来看看设置。
    • FTP AuthenticationAnonymous Authentication应设置为EnabledBasic Authentication应设置为Disabled提示:使用<alt> + <left>键盘快捷键返回主模块列表
    • FTP Authorization:按如下所示添加Allow Rule:选择Specified Users,并设置为IUSR。授予Read权限。
    • :如果您看到任何配置的规则,请将其移除。在右侧边栏点击Edit Feature Settings,然后确保它在Access for Unspecified Clients下设置为Allow。您可以不选中Enable Domain Retrictions
    • FTP SSL Settings:检查Allow SSL Connections。 (启用Require SSL connections不是你想要的。)
  7. 好的,现在在左侧边栏中,右键单击您的FTP站点并选择Edit Permissions,这将弹出打开属性窗口。转至Security选项卡,然后根据需要进行一些ACL更改。最重要的是,IUSR帐户至少需要以下内容:Read & Execute,List folder contents,Read。这会让你的代码匿名下载文件。您可能需要为上传功能添加ModifyWrite。要进行更改,您可能需要禁用从父目录—继承,如果是这样,我建议复制现有的权限,而不是从空白的石板开始。如果您在此处进行了任何更改,则可能需要使用Replace all child object permissions...选项,以确保从根目录下的所有内容现在都具有相同的访问控制条目。
  8. 打开一个管理员命令提示符,然后键入iisreset

好了,现在IIS已经配置,让我们来看看代码。将称为test.txt一个小的文本文件中的FTP站点的根目录后,我得到了下面的代码,改编自您的样品,以我的本地机器上运行:

string ftpHost = "ftp://localhost/test.txt"; 

FtpWebRequest request = (FtpWebRequest) WebRequest.Create(ftpHost); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

//anonymous logon 
request.Credentials = new NetworkCredential("anonymous", "[email protected]"); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

Stream responseStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(responseStream); 
Console.WriteLine(reader.ReadToEnd()); 

Console.WriteLine("Download Complete, status {0}", response.StatusDescription); 

reader.Close(); 
response.Close(); 

Console.ReadLine(); 

[免责声明:这些说明配置一个在开发机器上工作的本地FTP服务器,允许.NET FtpClient类以匿名方式连接到它。不要考虑在生产环境中使用这些好的指令。]

+0

不会ftpHost必须包含我给FTP站点的名称,比如ftp://localhost/MyFTPSite/test.txt?通过你的步骤,仍然有相同的错误。我做了第7步中的事情,但还没有为IUSR做过。 – Kelly 2014-09-05 16:37:38

+0

嗨凯利,这是正确的 - 在我的例子中,我在默认的IIS FTP根目录上运行一个FTP站点,所以不需要子目录('ftp:// localhost'直接映射到文件目录)。关键是你需要站点/文件的完整路径是正确的。一种快速测试路径和不安装的方法:打开FireFox或Chrome,然后尝试浏览到您的FTP根目录。如果它允许你进入,那么你知道路径是正确的,并且anon安全性已正确打开。在您的代码中,尝试在您的网络浏览器中验证确切路径后进行硬编码。在调试器中逐步完成,并报告您看到的任何前端。 – 2014-09-05 17:08:18

+0

此外,这是代码中的一个不同于我们正在讨论的范围,但由于代码示例中的倒数第二行有一个指定** lclhost **(而不是“localhost”)的文字路径,所以上面的hard在创建'FtpWebRequest'时编码一个已知工作路径(在浏览器中验证)将消除路径的变量成为问题。 – 2014-09-05 19:36:15

相关问题