如何在没有任何用户交互的情况下对服务器进行文件传输?

时间:2011-02-16 18:27:20

标签: c# asp.net vb.net ftp ftpwebrequest

在我的方案中,用户可以将zip文件上传到a.example.com

我希望创建一个“守护程序”,它会在指定的时间间隔内移动 - 将用户上传的任何zip文件从a.example.com转移到b.example.com

根据我目前收集的信息,

  1. 守护程序将是.ashx通用处理程序。
  2. 将通过plesk cron job
  3. 以指定的时间间隔触发守护程序
  4. 守护进程(感谢SLaks)将包含两个FtpWebRequest(一个用于阅读,一个用于写入)。
  5. 所以问题是如何实施第3步?

    • 我是否必须将整个文件读入memory()数组并尝试在b.example.com中写入?
    • 我怎么能把我读到的信息写到b.example.com
    • 我可以同时执行文件的读写吗?

    不,我不是要求完整的代码,我只能弄明白,如何在没有用户交互的情况下即时执行阅读和写作。

    我的意思是我可以从a.example.com本地下载文件并将其上传到b.example.com,但这不是重点。

8 个答案:

答案 0 :(得分:8)

这是另一种解决方案:

  1. 让服务器A中的ASP.Net作为常规文件上载接收文件,并将其存储在目录XXX
  2. 在服务器A中安装一个Windows服务,检查目录XXX是否有新文件。
  3. 让窗口服务使用HttpWebRequest
  4. 将文件上传到服务器B.
  5. 让服务器B使用常规的ASP.Net文件上传页面接收文件。
  6. 链接:

    你需要解决的问题:

    1. 如何确定要上传到服务器B的文件。我会在Directory.GetFiles中使用Timer来查找新文件,而不是使用FileSystemWatcher。您需要能够检查以前是否已上传文件(删除,重命名,检查数据库或任何适合您需要的文件)。

    2. 服务器B上的身份验证,只有您可以上传文件。

答案 1 :(得分:5)

回答您的问题 - 是的,您可以同时读取和写入文件。

您可以向ServerA打开FTPWebRequest,向ServerB打开FTPWebRequest。在FTPWebRequest到服务器A上,您将请求该文件,并获取ResponseStream。获得ResponseStream之后,您将一次读取一块字节,并将该字节块写入serverB RequestStream

您将使用的唯一内存是读/写循环中的byte[]缓冲区。请记住,FTPWebRequest的底层实现将在返回响应流之前下载完整的FTP文件。

同样,在写完所有字节之前,您无法发送FTPWebRequest上传新文件。实际上,操作将同步进行。您将调用GetResponse,在完整文件可用之前不会返回,只有这样您才能“上传”新文件。

参考文献:

FTPWebRequest

答案 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。