在我的方案中,用户可以将zip文件上传到a.example.com
我希望创建一个“守护程序”,它会在指定的时间间隔内移动 - 将用户上传的任何zip文件从a.example.com
转移到b.example.com
根据我目前收集的信息,
所以问题是如何实施第3步?
b.example.com
中写入?b.example.com
?不,我不是要求完整的代码,我只能弄明白,如何在没有用户交互的情况下即时执行阅读和写作。
我的意思是我可以从a.example.com
本地下载文件并将其上传到b.example.com
,但这不是重点。
答案 0 :(得分:8)
这是另一种解决方案:
HttpWebRequest
链接:
你需要解决的问题:
如何确定要上传到服务器B的文件。我会在Directory.GetFiles
中使用Timer
来查找新文件,而不是使用FileSystemWatcher
。您需要能够检查以前是否已上传文件(删除,重命名,检查数据库或任何适合您需要的文件)。
服务器B上的身份验证,只有您可以上传文件。
答案 1 :(得分:5)
回答您的问题 - 是的,您可以同时读取和写入文件。
您可以向ServerA打开FTPWebRequest
,向ServerB打开FTPWebRequest
。在FTPWebRequest
到服务器A上,您将请求该文件,并获取ResponseStream
。获得ResponseStream
之后,您将一次读取一块字节,并将该字节块写入serverB RequestStream
。
您将使用的唯一内存是读/写循环中的byte[]
缓冲区。请记住,FTPWebRequest
的底层实现将在返回响应流之前下载完整的FTP文件。
同样,在写完所有字节之前,您无法发送FTPWebRequest
上传新文件。实际上,操作将同步进行。您将调用GetResponse
,在完整文件可用之前不会返回,只有这样您才能“上传”新文件。
参考文献:
答案 2 :(得分:3)
您必须考虑的是,当AppDomain刷新时,可能会终止长时间运行的Web请求(您的.ashx通用处理程序)。因此,您必须在代码中实现某种原子事务逻辑,如果你这样做,你应该处理突然断开连接和不完整的FTP传输。
您以前看过Windows Azure吗?该云平台支持分布式文件系统,并具有内置的原子事务。如果您的服务快速增长,它可以很好地扩展。
答案 3 :(得分:2)
我会说得很简单。客户端程序将文件上传到服务器A.这可以通过FtpWebRequest在C#中轻松完成。
http://msdn.microsoft.com/en-us/library/ms229715.aspx
然后我会在服务器A上有一个服务,它监视文件上传的目录。当文件上传到该目录或在某个时间间隔时,它只是将文件复制到服务器B.如果它们位于同一网络上,也可以通过Ftp或其他方式完成。
答案 4 :(得分:1)
你需要在目标域上运行一些监听器,在那里运行ftp服务器,在客户端你将使用System.Net.WebClient和UploadFile或UploadFileAsync来发送文件。那就是你在问什么?
答案 5 :(得分:1)
听起来你真的不需要webservice或处理程序。您所需要的只是一个程序,它将定期打开与其他服务器的FTP连接并移动文件。这可以通过任何带有System.WebClient库的.NET程序来完成,而不必是“Web应用程序”。这个其他程序可以是一个服务,可以处理自己的时间,或由您的cron作业运行的简单应用程序。如果您需要两种方式,例如,如果两个服务器都是镜像,那么您只需在第二个框上使用相同的应用程序执行相同的操作即可将文件上传到第一个。
答案 6 :(得分:1)
如果两台计算机位于同一个域中,您是否只能在操作系统级别进行文件复制? DFS
答案 7 :(得分:1)
如果您使用的是基于Linux的系统,请设置密钥:
http://compdottech.blogspot.com/2007/10/unix-login-without-password-setting.html
一旦密钥正常工作,您可以通过编写不需要任何用户交互的常规shell脚本将文件从系统A复制到系统B。