8

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

我很想创建一个“守护程序”,它会在指定的时间间隔内将用户上传的任何 zip 文件a.example.comb.example.com

从我目前收集到的信息来看,

  1. 守护进程将是一个 .ashx 通用处理程序。
  2. 守护进程将通过plesk cron 作业在指定的时间间隔触发
  3. 守护进程(感谢SLaks)将包含两个 FtpWebRequest(一个用于读取,一个用于写入)。

所以问题是我如何实施第 3 步?

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

不,我不是要完整的代码,我只是想知道,我怎么能在没有用户交互的情况下即时执行读写操作。

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

4

8 回答 8

8

这是另一个解决方案:

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

链接:

你要解决的问题:

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

  2. 在服务器 B 上进行身份验证,以便只有您可以将文件上传到它。

于 2011-02-20T21:10:17.450 回答
5

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

您可以打开一个FTPWebRequest到 ServerA 和一个FTPWebRequest到 ServerB。在FTPWebRequestto serverA 上,您将请求该文件,并获取ResponseStream. 一旦拥有ResponseStream,您将一次读取一大块字节,然后将该块字节写入 serverB RequestStream

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

FTPWebRequest同样,在写入所有字节之前,您无法发送您的上传新文件。实际上,这些操作将同步发生。您将调用GetResponsewhich 在完整文件可用之前不会返回,然后您才能“上传”新文件。

参考:

FTPWeb请求

于 2011-02-23T18:27:56.333 回答
3

您必须考虑的是,当 AppDomain 刷新时,长时间运行的 Web 请求(您的 .ashx 通用处理程序)可能会被终止。因此,您必须在代码中实现某种原子事务逻辑,并且如果您采用这种方式,您应该处理突然断开连接和不完整的 FTP 传输。

您以前看过 Windows Azure 吗?该云平台支持分布式文件系统,内置原子事务。此外,如果您的服务快速增长,它可以很好地扩展。

于 2011-02-24T09:35:45.330 回答
2

我会让它变得非常简单。客户端程序将文件上传到服务器 A。这可以在 C# 中使用 FtpWebRequest 轻松完成。

http://msdn.microsoft.com/en-us/library/ms229715.aspx

然后,我将在服务器 A 上提供一项服务,该服务监视文件上传的目录。当一个文件被上传到那个目录或者在特定的时间间隔内,它只是简单地将文件复制到服务器 B。同样,如果它们在同一个网络上,这可以通过 Ftp 或其他方式完成。

于 2011-02-24T20:01:57.617 回答
1

如果两台机器都在同一个域中,你不能只在操作系统级别进行文件复制吗? DFS

于 2011-02-23T18:33:33.213 回答
1

听起来您并不真的需要网络服务或处理程序。您所需要的只是一个程序,它会定期打开与另一台服务器的 FTP 连接并移动文件。这可以通过任何带有 System.WebClient 库的 .NET 程序来完成,不必是“网络应用程序”。这个其他程序可以是一个服务,它可以处理自己的时间,或者是一个由您的 cron 作业运行的简单应用程序。如果您需要这两种方式,例如如果两台服务器是镜像,您只需在第二个盒子上使用相同的应用程序执行相同的操作将文件上传到第一个盒子。

于 2011-02-16T19:25:18.803 回答
1

您需要目标域上的一些侦听器,在那里运行的 ftp 服务器,在客户端,您将使用 System.Net.WebClient 和 UploadFile 或 UploadFileAsync 发送文件。这就是你要问的吗?

于 2011-02-16T18:31:35.850 回答
1

如果您使用的是基于 linux 的系统,请设置密钥:

http://compdottech.blogspot.com/2007/10/unix-login-without-password-setting.html

一旦您的密钥工作,您可以通过编写不需要任何用户交互的常规 shell 脚本将文件从系统 A 复制到系统 B。

于 2011-02-27T20:27:47.663 回答