- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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
}
异常是在 using
行(在 return
语句之外)的 FtpWebRequest.GetResponse()
调用中抛出的,没有别的在堆栈跟踪中:
System.Net.WebException
: Unable to connect to the remote server
atSystem.Net.FtpWebRequest.GetResponse()
at (that line number in that file)
我的测试工具(有效)和生产环境(无效)之间唯一真正的区别是生产环境中存在防火墙——所有四台服务器都位于略有不同的子网上:
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
但防火墙不是问题,因为我可以通过 FTP 以交互方式从 Prod 客户端到 Prod 服务器,而不是以编程方式。
我已经尝试更改 UsePassive
的 bool
appSettings 值,这没有任何区别,而且在任何情况下,FTP 服务器日志中都不会显示任何内容(所以它是没有那么远)。
现在我不指望任何人能够调试我的托管环境的硬件基础设施,但我正在努力想我还能做些什么来让它工作。我已经看到它在我的测试工具中本地工作,调用相同的方法。如果有帮助,测试工具代码如下:
[NUnit.Framework.Test]
public void FtpFileListTest()
{
ICollection<string> files = MediaSyncDaemon.GetFilesToFetch();
Assert.IsNotNull(files);
Assert.Greater(files.Count, 0);
}
有没有人知道我还可以尝试什么?
谢谢!
在评论中有一些建议可以查看的地方,我可以进一步更新:
问题似乎不是用户权限问题 — 服务在本地系统帐户的上下文中运行(has more permissions than Administrator 是)
问题似乎不是代码访问安全性。我添加了一个 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。
有人对我可以尝试的方法有任何进一步的建议吗?
最佳答案
我想分享我们的问题和解决方案:我们无法在公司 PC 上使用 ftpwebrequest 连接到 FTP 服务器,但在我们的 PC 上它可以正常工作。问题是 ftpwebrequest() 正在获取公司 IT 强加在 PC 上的代理配置。为了解决这个问题,我们添加了 (ftpwebrequest object).proxy = null;连接之前。
关于c# - FtpWeb 请求 WebException : "Unable to connect to the remote server",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714815/
我有一个与 IBM 大型机建立 FTP 连接的应用程序,并且一切正常。然后我针对 .NET 4 重新编译,大型机不再接受该文件,给我一条错误消息,指出该文件不存在,或者我没有权限。 这是我用来发送文件
我在 Windows 服务中有代码,当我通过测试工具在本地运行它时成功连接到 FTP 服务器(FTP 服务器位于本地网络上的另一台机器上)。 但是,当我在生产托管环境中安装它时,我得到了可怕的 Web
我正在尝试通过匿名 FTP 从远程 FTP 文件获取文件大小。 public static long GetSize(string ftpPath) { try { F
我一直收到错误消息“远程服务器返回错误:(530) 未登录。”当调用 FtpWebRequest.GetResponse() 时。我怀疑这是因为我错误地配置了用于基本身份验证的 FTP 站点,但我不确
我有一个 .NET 客户端应用程序,它尝试通过 ftp 将文件传输到具有自签名 TLS/SSL 证书的 FTP 站点。此 FTP 站点在 Windows 7 Enterprise、IIS 7 上运行。
我是一名优秀的程序员,十分优秀!