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

时间:2013-02-05 18:57:07

标签: c# ftpwebrequest system.net.webexception

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

但是,当我在生产托管环境中安装它时,我得到了可怕的WebException“无法连接到远程服务器”。我是否正在使用ACTV or PASV FTP似乎并不重要,我得到了这个WebException。但是,如果我尝试从Windows命令行进行FTP操作,它可以很好地工作(因此防火墙不是故障)。

我正在使用的代码(改编自How to List Directory Contents with FTP in C#?)读取:

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
}

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

  

System.Net.WebException:无法连接到远程服务器
  在System.Net.FtpWebRequest.GetResponse()
  at(该文件中的那个行号)

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

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服务器,只是不能以编程方式。

我已经尝试更改bool的{​​{1}} appSettings值,这没有任何区别,并且在每种情况下,FTP服务器日志中都没有显示任何内容(所以它没有达到那么远)。

现在我不希望任何人能够调试我的托管环境的硬件基础设施,但我很难想到还有什么我可以改变以使其工作。我已经看到它在我的测试工具中本地工作,调用相同的方法。如果有帮助,测试工具代码如下:

UsePassive

有没有人对我还能尝试什么有任何想法,好吗?

谢谢!


更新

我已经对评论中的地方提出了一些建议,我可以进一步更新:

  1. 问题似乎不是用户权限 - 服务在本地系统帐户的上下文中运行(has more permissions than Administrator执行)

  2. 问题似乎不是代码访问安全性。我为这段代码的条目方法添加了SocketPermission [NUnit.Framework.Test] public void FtpFileListTest() { ICollection<string> files = MediaSyncDaemon.GetFilesToFetch(); Assert.IsNotNull(files); Assert.Greater(files.Count, 0); } Demand次调用:

    .

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

  3. 有没有人对我可以尝试的内容有任何进一步的建议?

1 个答案:

答案 0 :(得分:1)

我想分享我们的问题和解决方案: 我们无法在企业PC上使用ftpwebrequest连接到FTP服务器,但在我们的PC上可以正常使用。 问题在于ftpwebrequest()正在获取公司IT在PC上强制使用的代理配置。 为了解决此问题,我们添加了(ftpwebrequest对象)。在连接之前。