【问题标题】:Accessing localhost FTP server via .Net通过 .Net 访问 localhost FTP 服务器
【发布时间】:2014-10-29 10:51:38
【问题描述】:

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

 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();

【问题讨论】:

    标签: asp.net iis ftp ftpwebrequest


    【解决方案1】:

    您的代码看起来可能没问题 - 您很可能可以通过修改 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提示:使用&lt;alt&gt;+&lt;left&gt; 键盘快捷键返回到主模块列表
      • FTP Authorization :添加Allow Rule 如下:选择Specified Users,并设置为IUSR。授予Read 权限。
      • FTP IP Address and Domain Restrictions:如果您看到任何已配置的规则,请删除此处显示的所有规则。在右侧边栏中单击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 &amp; ExecuteList folder contentsRead。这将使您的代码匿名下载文件。您可能需要添加 ModifyWrite 以获取上传功能。要进行更改,您可能需要禁用从父目录继承 - 如果是这样,我建议复制现有权限而不是从空白开始。如果您在此处进行了任何更改,您可能需要使用 Replace all child object permissions... 选项,以确保从根目录到现在的所有内容都具有相同的访问控制条目。
    8. 打开管理员命令提示符并输入iisreset

    好了,现在IIS已经配置好了,我们来看代码。在 FTP 站点的根目录中放置一个名为 test.txt 的小文本文件后,我得到了以下代码,改编自您的示例,可以在我的本地计算机上工作:

    string ftpHost = "ftp://localhost/test.txt";
    
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create(ftpHost);
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    
    //anonymous logon
    request.Credentials = new NetworkCredential("anonymous", "test@test.com"); 
    
    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 类匿名连接到它。不要将这些好的说明用于生产环境。]

    【讨论】:

    • ftpHost 是否必须包含我给 FTP 站点的名称,例如 localhost/MyFTPSite/test.txt?完成了您的步骤,但仍然遇到相同的错误。我做了第 7 步中的操作,还没有为 IUSR 做那件事。
    • 嗨,Kelly,这是正确的——在我的示例中,我在默认的 IIS ftp 根目录上运行 FTP 站点,因此不需要子目录(ftp://localhost 直接映射到文件目录)。关键是您需要正确的站点/文件的完整路径。一种快速测试路径和匿名设置的方法:打开 FireFox 或 Chrome,然后尝试浏览到您的 FTP 根目录。如果它让您进入,那么您知道路径是正确的,并且匿名安全已正确打开。在您的代码中尝试硬编码在您的网络浏览器中验证后的确切路径。在调试器中单步执行,并报告您看到的任何前任。
    • 另外,这与我们讨论的代码范围不同,但由于代码示例中的倒数第二行具有指定 lclhost 的文字路径(而不是“localhost”),当您创建FtpWebRequest 时,上述硬编码已知工作路径(在浏览器中验证)的步骤将消除路径变量的问题。
    • 当我转到 localhost 时,它要求我输入用户名和密码——所以也许我的匿名设置不正确?
    • 只是为了验证,您是否使用:ftp://localhost 进入浏览器?因为如果您使用http://localhost,那会将您的根 IIS 网站绑定到端口 80,这将具有它自己的安全设置。如果您确实访问了ftp://localhost,并且系统提示您输入用户名、密码,那么您应该再次查看该目录上的 ACL。可能是您可以为其添加“宽”权限,例如授予Users 读取/执行/列表。
    【解决方案2】:

    如果您在 IIS 上设置匿名登录请勿设置任何网络凭据。 注释掉:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2019-11-18
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多