4

C# .Net を使用して Visual Studio 2010 でプログラムを作成しています。

プログラムは、時間を節約するためのカスタム タイムアウトを使用して、指定された URL からローカル ドライブにファイルを保存することです。

URLがhttp://mywebsite.com/file1.pdfで、ファイルをディレクトリに保存したいとしますC:\downloadFiles\

現在、私は使用してWebClientいます。

WebClient.DownloadFile("http://mywebsite.com/file1.pdf", "C:\downloadFiles\file1.pdf");

ファイルを保存できましたが、問題が発生しました。

場合によっては、URL が応答しないことがあるため、プログラムを終了する前に 5 回ダウンロードを試みます。次に、WebClient のデフォルトのタイムアウトが長すぎることに気付きました (2 分など)。タイムアウトを短く設定する簡単な方法はありますか (15 秒など)。

HttpWebRequestまた、タイムアウトを簡単に設定できるも調べましたHttpWebRequest.Timeout = 15000;。ただし、この方法では、ファイルをダウンロード/保存する方法がわかりません。

したがって、私のすべての質問は次WebClientのとおりです。タイムアウトを設定するのと、を使用してファイルを保存するのとでは、どちらがより簡単HttpWebRequestですか? そして、どうすればそうすることができますか?

4

4 に答える 4

12

独自の WebClient を作成できます

public class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var req = base.GetWebRequest(address);
        req.Timeout = 15000;
        return req;
    }
}
于 2013-06-28T18:05:29.020 に答える
4

HttpClient.NET 4.5 を使用している場合は、次のクラスを使用できます。

using(var httpClient = new HttpClient())
{
    httpClient.Timeout = new TimeSpan(0, 0, 15);

    Stream response = await httpClient.GetStreamAsync("http://mywebsite.com/file1.pdf");

    ...
}

jsonLinqPad で応答を取得する例を次に示します: http://share.linqpad.net/aaeeum.linq

于 2013-06-28T18:18:14.067 に答える
1

でタイムアウトを直接変更する方法はありませんWebClient。ただし、代わりに使用できますWebClient.DownloadFileAsync()。これにより、必要なときに使用できるようになりますCancelAsync()

于 2013-06-28T18:05:44.820 に答える
0

.net 4以降では、次のようなことができます

var wreq = WebRequest.Create("http://mywebsite.com/file1.pdf");
wreq.Timeout = 15000;

var wresp = (HttpWebResponse)request.GetResponse();

using (Stream file = File.OpenWrite("path/to/output/file.pdf"))
{
    wresp.GetResponseStream().CopyTo(file); // CopyTo extension only .net 4.0+ 
}

それ以外の場合は、自分でコピーできます

using (Stream file = File.OpenWrite("path/to/output/file.pdf"))
{
    var input = wresp.GetResponseStream();

    var buffer = new byte[8 * 1024];

    int len;
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    {
        file.Write(buffer, 0, len);
    }
}
于 2013-06-28T18:33:52.587 に答える