3

我正在寻找一种通过 C# 的 WebClient 暂停或恢复上传过程的方法。

伪代码:

WebClient 客户端 = 新 WebClient();
Client.UploadFileAsync(new Uri("http://mysite.com/receiver.php"), "POST", "C:\MyFile.jpg");

也许像..

Client.Pause();

任何想法?

4

4 回答 4

6

WebClient没有这种功能-HttpWebRequest据我所知,即使是稍低的级别也没有。您将需要使用一个 HTTP 库,它可以让您更好地控制事情发生的时间(当然,这无疑也会涉及更多代码)。重点WebClient是提供一个非常简单的 API 以在非常简单的情况下使用。

于 2009-06-26T10:29:41.203 回答
3

正如 Jon Skeet 所说,这在 Webclient 而非 HttpWebRequest 类中不可用。

但是,如果您可以控制接收上传的服务器;也许您可以使用 WebClient 上传文件的小块,并在收到所有文件后让服务器组装这些块。然后,您会更容易制作暂停/恢复功能。

如果您无法控制服务器,您将需要使用一个 API,该 API 只为您提供控制,随后让您担心更多的事情。即便如此,如果你暂停太久,服务器可能会给你一个超时。

于 2009-06-26T10:40:44.553 回答
2

好的,在不给你代码示例的情况下,我会告诉你你能做什么。

为您的上传编写一个 WCF 服务,该服务需要使用流式传输。

要记住的事情:

  • 客户端和服务器需要以某种方式识别文件,我建议使用 Guid,以便服务器也知道要附加额外数据的文件。
  • 客户端需要跟踪数组中的位置,以便在恢复后知道从哪里开始流式传输。(您甚至可以让服务器告诉客户端它有多少数据,但要确保客户端也知道)。
  • 服务器需要跟踪它已经下载了多少数据以及仍然丢失了多少。文件在服务器上应该有一个生命周期,你不希望一半上传和遗忘的文件永远存储在服务器上。
  • 请记住,流式传输不允许身份验证,因为整个调用只是一个 httprequest。您可以使用 ssl 但请记住这会增加开销。
  • 您将需要以消息级别的标准方法创建服务合同。

我目前正在写一篇关于这个主题的博客文章,它将在本周发布,其中包含如何让它工作的代码示例。

你可以在我的博客上查看

我知道这不包含代码示例,但博客会有一些,但总而言之,这是停止和恢复文件上传到服务器的一种方式。

于 2009-09-21T11:30:29.417 回答
0

要执行此类操作,您必须编写自己的工作线程来逐步执行实际的 http post。

在发送之前,您必须检查操作是否已暂停并停止发送文件内容,直到它恢复。

但是,根据服务器的不同,如果连接在一段时间内不活动,则可以关闭连接,这可能只是几秒钟。

于 2009-06-26T10:41:39.340 回答