如何在没有任何用户交互的情况下进行服务器到服务器的文件传输?
Posted
技术标签:
【中文标题】如何在没有任何用户交互的情况下进行服务器到服务器的文件传输?【英文标题】:How To Do a Server To Server File Transfer without any user interaction? 【发布时间】:2011-06-28 13:53:18 【问题描述】:在我的场景中,用户可以将 zip 文件上传到 a.example.com
我很想创建一个“守护程序”,它会在指定的时间间隔内将用户上传的任何 zip 文件从 a.example.com
移动传输到 b.example.com
根据我目前收集到的信息,
-
守护进程将是一个 .ashx 通用处理程序。
守护程序将在指定的时间间隔通过plesk cron job 触发
守护进程(感谢SLaks)将包含两个 FtpWebRequest(一个用于读取,一个用于写入)。
所以问题是我如何实施第 3 步?
我是否必须将整个文件读入 memory() 数组并尝试将其写入b.example.com
?
如何将我阅读的信息写入b.example.com
?
可以同时读写文件吗?
不,我不是要完整的代码,我只是想知道,我如何在没有用户交互的情况下即时执行读写操作。
我的意思是我可以从a.example.com
在本地下载文件,然后在b.example.com
上传,但这不是重点。
【问题讨论】:
【参考方案1】:如果您使用的是基于 linux 的系统,请设置密钥:
http://compdottech.blogspot.com/2007/10/unix-login-without-password-setting.html
一旦密钥正常工作,您可以通过编写不需要任何用户交互的常规 shell 脚本将文件从系统 A 复制到系统 B。
【讨论】:
【参考方案2】:回答您的问题 - 是的,您可以同时读取和写入文件。
您可以打开一个FTPWebRequest
到服务器A 和一个FTPWebRequest
到服务器B。在服务器 A 的 FTPWebRequest
上,您将请求该文件,并获取 ResponseStream
。拥有ResponseStream
后,您将一次读取一大块字节,然后将该块字节写入服务器B RequestStream
。
您将使用的唯一内存是读/写循环中的byte[]
缓冲区。请记住,FTPWebRequest
的底层实现将在返回响应流之前下载完整的 FTP 文件。
同样,在写入所有字节之前,您不能发送 FTPWebRequest
来上传新文件。实际上,这些操作将同步发生。您将调用GetResponse
,直到完整文件可用后才会返回,然后您才能“上传”新文件。
参考资料:
FTPWebRequest
【讨论】:
【参考方案3】:我会让它变得非常简单。客户端程序将文件上传到服务器 A。这可以在 C# 中使用 FtpWebRequest 轻松完成。
http://msdn.microsoft.com/en-us/library/ms229715.aspx
然后,我将在服务器 A 上提供一项服务,用于监控文件上传的目录。当文件上传到该目录或在特定时间间隔内,它只是将文件复制到服务器 B。同样,如果它们位于同一网络上,则可以通过 Ftp 或其他方式完成。
【讨论】:
【参考方案4】:您必须考虑的是,当 AppDomain 刷新时,长时间运行的 Web 请求(您的 .ashx 通用处理程序)可能会被终止。因此,您必须在您的代码中实现某种原子事务逻辑,如果您这样做,您应该处理突然断开连接和不完整的 FTP 传输。
您以前看过 Windows Azure 吗?该云平台支持分布式文件系统,内置原子事务。此外,如果您的服务快速增长,它可以很好地扩展。
【讨论】:
【参考方案5】:如果两台机器在同一个域中,你不能只在操作系统级别进行文件复制吗? DFS
【讨论】:
【参考方案6】:这是另一个解决方案:
-
让服务器 A 中的 ASP.Net 接收文件作为常规文件上传并将其存储在目录 XXX 中
在服务器 A 中有一个 Windows 服务,用于检查目录 XXX 是否有新文件。
让窗口服务使用
HttpWebRequest
将文件上传到服务器B
让服务器 B 使用常规的 ASP.Net 文件上传页面接收文件。
链接:
文件上传示例(ASP.Net):http://msdn.microsoft.com/en-us/library/aa479405.aspx 构建windows服务:http://www.codeproject.com/KB/system/WindowsService.aspx 使用 HttpWebRequest 上传文件:Upload files with HTTPWebrequest (multipart/form-data)你必须解决的问题:
如何确定要上传到服务器 B 的文件。我会在 Timer
中使用 Directory.GetFiles
来查找新文件,而不是使用 FileSystemWatcher
。您需要能够检查之前是否已上传文件(删除、重命名、检查 DB 或任何适合您需要的内容)。
在服务器 B 上进行身份验证,因此只有您可以向其上传文件。
【讨论】:
【参考方案7】:听起来您并不真的需要网络服务或处理程序。您所需要的只是一个程序,它会定期打开与另一台服务器的 FTP 连接并移动文件。这可以通过任何带有 System.WebClient 库的 .NET 程序来完成,不必是“网络应用程序”。这个其他程序可以是一个服务,它可以处理自己的时间,或者是一个由您的 cron 作业运行的简单应用程序。如果您需要这两种方式,例如如果两台服务器是镜像服务器,您只需在第二台机器上使用相同的应用程序执行相同的操作将文件上传到第一台服务器。
【讨论】:
【参考方案8】:您需要目标域上的一些侦听器,在那里运行的 ftp 服务器,在客户端,您将使用 System.Net.WebClient 和 UploadFile 或 UploadFileAsync 发送文件。你问的是这个吗?
【讨论】:
@Alex 你能更具体地谈谈“一些听众”的问题吗? @Chocol8 我假设您的网络服务器在 2 个单独的盒子上运行,在您要将文件发送到的域上也应该有一个 ftp 服务器运行。b.example.com
只需要运行一个 FTP 服务器。然后处理程序(或页面,实际上没有理由创建处理程序)将从a
FTP 到b
。
@Chris,我认为他希望能够从两个域提供文件,然后他需要在 b 上运行网络服务器,否则,你是对的,只有 b 上的 ftp。跨度>
@Alex,我想我现在明白了,谢谢。上传到a
,处理来自a
的读取请求,直到文件移动到b
,然后所有请求都从a
路由到b
。以上是关于如何在没有任何用户交互的情况下进行服务器到服务器的文件传输?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有用户交互的情况下使用 GMail API 创建草稿
在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?