0

webclientからファイルをダウンロードしようとしていますが、コードは次のようになっています。問題は、404応答が何度も続く場合、サーバーが100%に達し、イベントログを表示すると、スタックオーバーフローが発生したことを示していることです。ここで、「count」変数は0バイトのファイルを回避するためのものであり、count404は404応答用です。

    int count = 0; int count404 = 0;
    public Stream DownloadFileThroughWebClient(string strFilePath)
    {
        try
        {
            if (count >= 120 || count404 >= 30)
            {
                count = 0;
                count404 = 0;
                return null;
            }
            System.Threading.Thread.Sleep(1000);
            System.Net.WebClient wc = new System.Net.WebClient();
            var v = wc.DownloadData(strFilePath);
            Stream FileToSave = new MemoryStream(v);
            byte[] bytes = new byte[FileToSave.Length];
            int numBytesToRead = (int)FileToSave.Length;
            if (numBytesToRead > 0)
            {
                count = 0;
                count404 = 0;
                return FileToSave;
            }
            else
            {
                count++;
                count404 = 0;
                return DownloadFileThroughWebClient(strFilePath);
            }
        }
        catch (Exception ex)
        {
            count++;
            count404++;
            return DownloadFileThroughWebClient(strFilePath);
        }
    }

前もって感謝します。

4

2 に答える 2

1

あなたが呼ぶ:

return DownloadFileThroughWebClient(strFilePath);

何かがうまくいかない場合。404を取得し続ける場合(または、より可能性が高いのは、不正なクエリのためにIPブロックされている場合)、もちろん、スタックオーバーフローが発生します。これは、再帰的に何度も自分自身を呼び出すとどうなるかですだから:そうしないでください。ある種の「while」ループ(成功または永続的な失敗のいずれかに対する正常な終了条件)は、再帰よりも適切であるように思われます。

于 2012-09-23T10:30:33.680 に答える
1

これを試してください(再帰を使用せず、404を正しくカウントします):

public Stream DownloadFileThroughWebClient(string strFilePath)
{
    int count = 0; 
    int count404 = 0;

    while (count < 120 && count404 < 30)
    {
        try
        {
            byte[] v;
            using (var wc = new WebClient())
            {
                v = wc.DownloadData(strFilePath);
            }

            if (v.Length > 0)
            {
                return new MemoryStream(v);
            }

            count++;
            count404 = 0;
        }
        catch (WebException ex)
        {
            count++;
            var httpWebResponse = ex.Response as HttpWebResponse;
            if (httpWebResponse != null && httpWebResponse.StatusCode == HttpStatusCode.NotFound)
            {
                count404++;
                // you may wanna break out of the loop here since there's no point in continuing 
            }
        }
        catch (Exception ex)
        {

        }
    }
    return null;
}
于 2012-09-23T10:34:47.323 に答える