FtpWebRequest WebException:“;“无法连接到远程服务器”;

本文关键字:服务器 WebException FtpWebRequest 连接 | 更新日期: 2023-09-27 17:57:42

我在Windows服务中有代码,当我通过测试线束在本地运行FTP服务器时(FTP服务器位于本地网络上的另一台机器上),该代码成功连接到FTP服务器。

然而,当我在生产托管环境中安装它时,我会遇到可怕的WebException"无法连接到远程服务器"。无论我使用的是ACTV还是PASV FTP似乎都无关紧要,我得到的只是这个WebException。然而,如果我尝试从Windows命令行进行FTP,它运行得非常好(所以这不是防火墙的错)。

我使用的代码(改编自C#中如何使用FTP列出目录内容?)如下:

private static readonly string __ftpSourceServer = "ftp://"
  + ConfigurationManager.AppSettings["FtpServer"] + "/";
private static readonly NetworkCredential __ftpCreds = new NetworkCredential(
  ConfigurationManager.AppSettings["Username"],
  ConfigurationManager.AppSettings["Password"]);
// And now the method MediaSyncDaemon.GetFilesToFetch:
bool usePassive = Boolean.TryParse(ConfigurationManager.AppSettings["UsePassive"]
  , out usePassive) && usePassive;
Uri ftpSrv = new Uri(__ftpSourceServer + Uri.EscapeUriString(
  ConfigurationManager.AppSettings["FtpPath"]));
Logger.Debug("Connecting to FTP server at " + ftpSrv + "; PASV? " + usePassive);
FtpWebRequest listRequest = (FtpWebRequest) WebRequest.Create(ftpSrv);
listRequest.Method = WebRequestMethods.Ftp.ListDirectory;
listRequest.Credentials = __ftpCreds;
listRequest.UsePassive = usePassive;
listRequest.UseBinary = false;
using (FtpWebResponse listResponse = (FtpWebResponse) listRequest.GetResponse())
{
    // ReSharper disable AssignNullToNotNullAttribute
    return new StreamReader(listResponse.GetResponseStream())
        .ReadToEnd().Split(new[] { ''n', ''r' },
            StringSplitOptions.RemoveEmptyEntries)
        .Where(s => s.EndsWith(".zip", true, CultureInfo.InvariantCulture))
        .ToList();
    // ReSharper restore AssignNullToNotNullAttribute
}

异常在using行的FtpWebRequest.GetResponse()调用处抛出(在return语句之外),堆栈跟踪中没有其他异常:

System.Net.WebException:无法连接到远程服务器
System.Net.FtpWebRequest.GetResponse()

我的测试工具(有效)和生产环境(无效)之间唯一真正的区别是生产环境中存在防火墙——所有四台服务器都位于略有不同的子网上:

Dev client    10.16.6.155     subnet 255.255.255.128
Dev server    10.16.7.242     subnet 255.255.255.0
Prod client   192.168.102.107 subnet 255.255.255.0
Prod server   192.168.203.110 subnet 255.255.255.0

但防火墙不可能是问题,因为我可以交互地从Prod客户端FTP到Prod服务器,只是不能通过编程。

我已经尝试更改UsePassivebool appSettings值,这没有什么区别,而且在任何情况下,FTP服务器日志中都不会显示任何内容(所以还没有到那个地步)。

现在,我不希望有人能够调试我的托管环境的硬件基础设施,但我很难想象我还能做些什么来让它发挥作用。我看到它在我的测试工具中本地工作,调用相同的方法。如果有帮助,测试线束代码如下所示:

[NUnit.Framework.Test]
public void FtpFileListTest()
{
    ICollection<string> files = MediaSyncDaemon.GetFilesToFetch();
    Assert.IsNotNull(files);
    Assert.Greater(files.Count, 0);
}

有人知道我还能尝试什么吗?

谢谢!


更新

在评论中有一些地方的建议后,我可以进一步更新:

  1. 问题似乎不是用户权限——服务是在本地系统帐户的上下文中运行的(该帐户的权限比管理员多)

  2. 问题似乎不是代码访问安全问题。我已经为这段代码的输入方法添加了一个SocketPermission . Demand调用:

    System.Security.CodeAccessPermission socketPermission;
    socketPermission = new SocketPermission(NetworkAccess.Connect,
      TransportType.Tcp, ConfigurationManager.AppSettings["FtpServer"], 20);
    socketPermission.Demand();
    socketPermission = new SocketPermission(NetworkAccess.Connect,
      TransportType.Tcp, ConfigurationManager.AppSettings["FtpServer"], 21);
    socketPermission.Demand();
    

    因此,我没有看到任何SecurityException被抛出;我仍然得到相同的WebException,在相同代码位置的新行号处。

有人对我可以尝试什么有进一步的建议吗?

FtpWebRequest WebException:“;“无法连接到远程服务器”;

我想分享我们的问题和解决方案:我们无法在公司电脑上使用ftpwebrequest连接到FTP服务器,但在我们的电脑上可以正常工作。问题是ftpwebrequest()正在获取该公司IT部门在PC上强制执行的代理配置。为了解决这个问题,我们添加了(ftpwebrequest对象).proxy=null;连接之前。