在 C# 中暂停/恢复上传

Posted

技术标签:

【中文标题】在 C# 中暂停/恢复上传【英文标题】:Pause/Resume Upload in C# 【发布时间】:2010-11-06 02:34:51 【问题描述】:

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

伪代码:

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

也许像..

Client.Pause();

有什么想法吗?

【问题讨论】:

同意乔恩的观点!我实际上打开了这个问题,因为我很想知道 C# 和 PHP 是如何相处的;) 【参考方案1】:

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

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

要记住的事情:

客户端和服务器需要识别 该文件是我建议使用的一些方法 一个 Guid,所以服务器知道什么 文件以附加额外的数据。 客户端需要跟踪 在数组中的位置,所以它知道 在它之后从哪里开始流式传输 恢复它。 (你甚至可以得到 服务器告诉客户端多少钱 它拥有的数据,但请确保客户端 也知道)。 服务器需要跟踪如何 它已经下载了很多数据 以及还缺少多少。文件 应该有一生的时间 服务器,你不想上传一半 和被遗忘的文件存储在 永远的服务器。 请记住,流式传输确实 不允许身份验证,因为 整个调用只是一个 httprequest。 您可以使用 ssl 但请记住 会增加开销。 您需要创建服务 消息级标准合同 方法不行。

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

你可以在My blog查看它

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在 C# 中暂停/恢复上传的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSURLSession UploadTask 暂停、恢复、取消上传任务

在 AFNetworking 重新连接网络时恢复所有上传任务

WebUploader暂停后再开始上传怎么没有反应?

支持恢复将大文件上传到 S3

支持恢复将大文件上传到 S3

在 C# 中暂停/恢复线程