Файл загрузки WebClient поврежден

Я пытаюсь использовать С# WebClient для загрузки файла.

Вот URL-адрес: http://www.czce.com.cn/cn/DFSStaticFiles/Future/2018/20180821/FutureDataClearParams.txt

Если я загружаю его вручную, все выглядит нормально. Однако, если я использую WebClient для загрузки файла, содержимое будет повреждено. Я пытался использовать много разных методов кодирования. Ниже приведен минимальный код для воспроизведения проблемы.

class Program
{
    static void Main(string[] args)
    {
        WebClient client = new WebClient();
        client.Proxy = new WebProxy("some company proxy");
        string url = "http://www.czce.com.cn/cn/DFSStaticFiles/Future/2018/20180821/FutureDataClearParams.txt";
        client.DownloadFile(url, @"D:\file.txt");
    }
}

Теперь проблема решена, спасибо всем за помощь(@Gauravsa, @John). Файл действительно GZIP.

Решение:

public class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        return request;
    }
}

person David    schedule 22.08.2018    source источник
comment
Можете ли вы объяснить, как он испорчен?   -  person Llama    schedule 22.08.2018
comment
Разместите код, желательно минимально воспроизводимый пример.   -  person Lasse V. Karlsen    schedule 22.08.2018
comment
Как вы определили, что кодировка файла UTF-8?   -  person Tom W    schedule 22.08.2018
comment
WebClient.Encoding используется во время загрузки, а не загрузки. При загрузке вместо этого используется кодировка, установленная сервером, так что это отвлекающий маневр.   -  person Lasse V. Karlsen    schedule 22.08.2018
comment
@Lasse Это и DownloadFile работают без проблем. Я получаю тот же самый файл, как если бы я загружал его через свой веб-браузер (отсюда мой отрицательный голос за вопрос).   -  person Llama    schedule 22.08.2018
comment
Возможный дубликат WebClient загружает поврежденный файл в Windows 8.1   -  person Pac0    schedule 22.08.2018


Ответы (2)


Используйте WebClient.DownloadFile:

using (WebClient client = new WebClient())
{
    client.DownloadFile("http://www.czce.com.cn/cn/DFSStaticFiles/Future/2018/20180821/FutureDataClearParams.txt", 
                        @"c:\Users\Jon\Test\foo.txt");
}

or

using (WebClient client = new WebClient())
{
        client.DownloadFile("http://www.czce.com.cn/cn/DFSStaticFiles/Future/2018/20180821/FutureDataClearParams.txt", 
                            "c:\\Users\\Jon\\Test\\foo.txt");
}

Вы можете выполнять другие операции файлового ввода-вывода, например

if(!Directory.Exists("c:\\Users\\Jon\\Test\\")
    Directory.CreateDirectory("c:\\Users\\Jon\\Test\\");

...

person Gauravsa    schedule 22.08.2018
comment
Я пробовал, если открыть foo.txt, все повреждено. сравнить с загруженным вручную результатом - person David; 22.08.2018
comment
Используйте Fiddler, чтобы узнать, что происходит на уровне HTTP. Вам нужно выяснить, что нужно серверу в качестве входных данных, чтобы ответить правильным содержимым. - person Gauravsa; 22.08.2018
comment
@David Не могли бы вы улучшить свой вопрос, чтобы люди могли дать вам полезные ответы? DownloadFile отлично работает для меня и побайтно идентичен файлу, загруженному через Google Chrome. - person Llama; 22.08.2018
comment
@David: сервер может вернуть файл в формате GZip - person Gauravsa; 22.08.2018
comment
Возможное решение: stackoverflow .com/questions/26206141/ - person Gauravsa; 22.08.2018
comment
@David После редактирования я думаю, что Гауравса что-то задумал. Прокси-сервер вашей компании может использовать сжатие gzip, чтобы уменьшить размер файла. Попробуйте модифицированное решение для веб-клиента, ссылка на которое приведена ^ - person Llama; 22.08.2018
comment
@John, я обновил вопрос, указав пример кода, который вызывает проблему на моей стороне. - person David; 22.08.2018

Тестирую и работаю.

Например, посмотрите на это консольное приложение. Он загружает ваш файл с URL-адреса и сохраняет его на рабочем столе как файл.txt. :

class Program
{
    static void Main(string[] args)
    {
    WebClient client = new WebClient();
                string address = "http://www.czce.com.cn/cn/DFSStaticFiles/Future/2018/20180821/FutureDataClearParams.txt";
                // Save the file to desktop for debugging
                var desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                string fileName = desktop + "\\file.txt";
                client.DownloadFile(address, fileName);
    }
}
person Hossein    schedule 22.08.2018
comment
Разве это не должно быть опубликовано в качестве комментария? Как в Ну, это работает отлично для меня. Можете ли вы опубликовать минимально воспроизводимый пример, демонстрирующий проблему? - person Llama; 22.08.2018
comment
@John, я обновил код минимальным полным и проверяемым примером, за исключением прокси-части, я также прикрепил поврежденный результат, если это поможет - person David; 22.08.2018