ThreadAbortException (WebClient использует DownloadFile для захвата файла с сервера) - PullRequest
2 голосов
/ 30 марта 2010

Ссылка на мой предыдущий вопрос относительно загрузки файла с сервера и правильной обработки исключений. Я уверен, что я решил эту проблему, а затем в классическом программировании вернулся через несколько дней, чтобы разочарованно найти его сломанным: - (


Обновленный код:

private static void GoGetIt(HttpContext context)
    {
        var directoryInfoOfWhereTheDirectoryFullOfFilesShouldBe = new FileInfo(......);
                var name = SomeBasicLogicToDecideName();

            //if (!directoryInfoOfWhereTheDirectoryFullOfFilesShouldBe.RefreshExists())
            //{
            //  throw new Exception(string.Format("Could not find {0}.", name));
            //}

            var tempDirectory = ""; //Omitted - creates temporary directory

            try
            {
                directoryInfoOfWhereTheDirectoryFullOfFilesShouldBe.CopyAll(tempDirectory);
                var response = context.Response;
                response.ContentType = "binary/octet-stream";
                response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.zip", name));
                ZipHelper.ZipDirectoryToStream(tempDirectory, response.OutputStream);
                response.End();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
                context.Response.StatusCode = 404;
            }
            finally
            {
                tempDirectory.DeleteWithPrejudice();
            }
        }

Это работало нормально и возвращало zip, иначе, если файл не существовал, возвращая 404. Затем на стороне клиента я мог бы обработать это:

public bool Download()
{   
 try
                {
                    using (var client = new WebClient())
                    {
                        client.DownloadFile(name, tempFilePath);
                    }

                }
                catch (Exception)
                {
                    fileExists = false;
                }
return fileExists;
    }

Но проблема сейчас в двух вещах.

1) Я получаю System.Threading.ThreadAbortException: поток был прерван в блоке try-catch на стороне сервера. Обычно это был файл, не найденный исключением. Я понятия не имею, что или почему выдает это новое исключение?

2) Теперь, когда на стороне сервера выдается другое исключение вместо файла, который не найден, может показаться, что я не могу использовать эту настройку для приложения, поскольку на стороне клиента предполагается, что любое исключение filenotfound.

Любая помощь, особенно информация о том, почему выбрасывается исключение ThreadAbortException!?!? с благодарностью Приветствия

1 Ответ

2 голосов
/ 30 марта 2010

Проблема в том, что Response.End () генерирует исключение ThreadAbortException: так он завершает запрос. Просто избавьтесь от этого звонка, он вам не нужен.

...