我在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
有没有人对我还能尝试什么有任何想法,好吗?
谢谢!
我已经对评论中的地方提出了一些建议,我可以进一步更新:
问题似乎不是用户权限 - 服务在本地系统帐户的上下文中运行(has more permissions than Administrator执行)
问题似乎不是代码访问安全性。我为这段代码的条目方法添加了SocketPermission
[NUnit.Framework.Test]
public void FtpFileListTest()
{
ICollection<string> files = MediaSyncDaemon.GetFilesToFetch();
Assert.IsNotNull(files);
Assert.Greater(files.Count, 0);
}
Demand
次调用:
.
我没有看到任何SecurityException被抛出;我仍然在相同代码位置的新行号处获得相同的WebException。
有没有人对我可以尝试的内容有任何进一步的建议?
答案 0 :(得分:1)
我想分享我们的问题和解决方案: 我们无法在企业PC上使用ftpwebrequest连接到FTP服务器,但在我们的PC上可以正常使用。 问题在于ftpwebrequest()正在获取公司IT在PC上强制使用的代理配置。 为了解决此问题,我们添加了(ftpwebrequest对象)。在连接之前。