0

我的目标是在从最新写入的字节而不是从 0 开始暂停下载后继续下载某些文件。我已经将addRange 标头添加到我的自定义类中(按预期工作)但默认情况下 DownloadFileAsync 会覆盖我下载的文件,从而从头开始创建它。

这是我的自定义类:

public class CookieAwareWebClient : WebClient
{
    private class CookieContainer
    {
        Dictionary<string, string> _cookies;

        public string this[Uri url]
        {
            get
            {
                if (_cookies.TryGetValue(url.Host, out string cookie))
                    return cookie;

                return null;
            }
            set
            {
                _cookies[url.Host] = value;
            }
        }

        public CookieContainer()
        {
            _cookies = new Dictionary<string, string>();
        }
    }

    private CookieContainer cookies;

    private readonly long from;
    private readonly long to;

    public CookieAwareWebClient(long from, long to) : base()
    {
        cookies = new CookieContainer();
        this.from = from;
        this.to = to;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest request = base.GetWebRequest(address);

        if (request is HttpWebRequest)
        {
            string cookie = cookies[address];
            if (cookie != null)
                ((HttpWebRequest)request).Headers.Set("cookie", cookie);

            if (from != 0 || to != 0)
            {
                ((HttpWebRequest)request).AddRange(from, to);
            }
        }

        return request;
    }

    protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
    {
        WebResponse response = base.GetWebResponse(request, result);

        string[] cookies = response.Headers.GetValues("Set-Cookie");
        if (cookies != null && cookies.Length > 0)
        {
            string cookie = "";
            foreach (string c in cookies)
                cookie += c;

            this.cookies[response.ResponseUri] = cookie;
        }

        return response;
    }

    protected override WebResponse GetWebResponse(WebRequest request)
    {
        WebResponse response = base.GetWebResponse(request);

        string[] cookies = response.Headers.GetValues("Set-Cookie");
        if (cookies != null && cookies.Length > 0)
        {
            string cookie = "";
            foreach (string c in cookies)
                cookie += c;

            this.cookies[response.ResponseUri] = cookie;
        }

        return response;
    }
}
4

1 回答 1

0

DownloadFileAsync不是虚拟的,所以你不能覆盖它。

WebClient.DownloadFileAsync方法是从网络位置下载文件的便捷方法,它只接受 URL 和本地路径并完成工作。pause-and-resume 的要求不在此 API 的范围内,您必须编写一些代码从响应流中读取,并写入文件流(以 Append 模式从现有文件中打开)。

于 2017-06-11T05:29:31.283 回答