Ответ.Файл записи, останавливающий предыдущий запрос

#c# #asp.net

#c# #asp.net

Вопрос:

У меня есть кнопка, которая вызывает событие click для загрузки изображения. В моем событии click у меня есть некоторый код для изменения моего отображения при появлении диалогового окна сохранения. Проблема, с которой я сталкиваюсь, заключается в том, что когда появляется диалоговое окно, оно останавливает выполнение предыдущей строки кода. Как я могу проверить, что мой код был выполнен перед вызовом функции?

Вот мой обработчик события кнопки и функция:

  protected void btnSave_Click(object sender, EventArgs e)
{
    var _title          = txtTitle.Text;
    txtTitle.Text       = string.Empty;
    txtDescription.Text = string.Empty;

    ChangeDisplay();

    if (Request.Browser.Browser == "IE")
        lblSnapShot.Visible = (lblSnapShot.Visible) ? false : true;

    SaveSnapShot(_title);
}

void SaveSnapShot(string _title)
{
    try
    {
        FileInfo _fileToDownload = new FileInfo(_path);
        Response.Clear();
        Response.ContentType = "image/png";
        Response.AppendHeader("Content-Disposition", "attachment; filename=""   _title   ".png"");
        Response.WriteFile(_fileToDownload.FullName);

        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    catch (System.Exception ex)
    {
        ChangeDisplay();

        if (Request.Browser.Browser == "IE")
            lblSnapShot.Visible = (lblSnapShot.Visible) ? false : true;

        Response.Write("SAVE FAILED n Error: "   ex.Message);
    }
}
  

Комментарии:

1. единственное, response.write что я вижу, это когда «Не удалось сохранить». Не могли бы вы немного подробнее объяснить свой вопрос.

2. @rockinthesixstring Прошу прощения за расплывчатость вопроса. Заголовок моего вопроса должен был быть Response . Файл записи. В событии click не выполняется весь код, предшествующий вызову функции saveSnapshot();. Похоже, что ответ. Файл записи останавливает обработку этого кода. Если я закомментирую вызов функции, будет выполнен весь код в событии click.

3. и у Response.End() та же проблема, что и у CompleteRequest()?

4. Да, у Response.End() та же проблема.

5. вы пробовали добавить ответ. Flush() непосредственно перед завершением запроса?

Ответ №1:

Ответ.WriteFile не останавливает обработку другого кода (этот код появляется еще до того, как вы вызываете WriteFile, так как же это могло произойти?)

Однако ваш метод saveSnapshot отправляет обратно в браузер изображение вместо обычного ответа в формате HTML. На каждый запрос из браузера вы можете отправить только один ответ — вы не можете отправить обратно файл изображения и обновить HTML одновременно.

Комментарии:

1. Я думал о том же, но когда я комментирую вызов, другой код обрабатывается просто отлично.

2. правильно. обычно, ASP.NET сгенерирует и отправит обратно HTML. когда вы вызываете Response. Файл записи, вы переопределяете это и сообщаете ASP.NET вместо этого отправить обратно файл. вам нужно заставить браузер пользователя (через javascript) сделать отдельный запрос к вашему веб-приложению, и в отдельном запросе вы должны вызвать Response. Файл записи.

3. Спасибо. Можете ли вы привести мне пример создания отдельного запроса. Надеюсь, я не задаю глупый вопрос. Я некоторое время боролся с этим, и сейчас мой мозг работает с низкой скоростью.