Response.WriteFile & Response.Redirect - PullRequest
       5

Response.WriteFile & Response.Redirect

5 голосов
/ 01 февраля 2012

Я публикую URL-адрес страницы, например, mysite.com/disclaimer/someinfo, на этой странице отображается соглашение, и если пользователь нажимает кнопку согласия, файл PDF передается в виде вложения.

ЦельЭто значит, что пользователь может поделиться этим URL, но любой, кто переходит по ссылке, должен также прочитать соглашение перед загрузкой файла.Фактический файл не имеет URL-адреса, но хранится в другом месте на сервере, поэтому единственный способ загрузить файл - это нажать кнопку «Согласен».

Тем не менее, сложность заключается в том, чтопосле нажатия кнопки и начала загрузки, я бы хотел, чтобы страница «ушла».Страница с кнопками остается на экране.В идеале они будут перенаправлены обратно на страницу, с которой пришли.Я стремлюсь не требовать JavaScript или куки.Реферрер сохраняется при начальной загрузке страницы в скрытое поле в форме.

Я пробовал разные подходы, пытаясь написать редирект 307 в заголовке с файлом, выдававшим пользователю предупреждения о том, что ихпочтовые данные были перенаправлены.Приведенный ниже код работает только в браузерах, которые поддерживают метаобновление (например, Firefox; IE7 не Chrome / Safari)

Я вижу логику того, почему это не работает.Есть один ответ на браузер, и это файл, как и ожидалось.Какой будет правильный способ отправить им файл, а затем перенаправить браузер на другую страницу.По мнению пользователей pov, эта страница «Принять» должна исчезнуть после нажатия кнопки.

У меня есть:

protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.UrlReferrer != null & Request.UrlReferrer.ToString() != "")
        {
            Uri referrer = Request.UrlReferrer;
            if (!IsPostBack)
            { hfReferrer.Value = Request.UrlReferrer.ToString(); }
        }
    }

    protected void buttonAccept_Click(object sender, EventArgs e)
    {
        //stream file
        Node nodeCurrent = Node.GetCurrent();
        string fileName = nodeCurrent.GetProperty("documentFile").Value.ToString();
        System.IO.FileInfo file = new System.IO.FileInfo(fileName); 
        if (file.Exists) //set appropriate headers  
        {
            Response.Clear();

            if (hfReferrer.Value !="")
            {Response.AddHeader("Refresh", string.Format("3; URL={0}", hfReferrer.Value));}

            Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
            Response.AddHeader("Content-Length", file.Length.ToString());
            Response.ContentType = "application/pdf";

            // write file to browser
            Response.WriteFile(file.FullName);
            Response.End();
        }

Я бы предпочел не использовать javascript/ всплывающие окна и т. д. В настоящее время пользователю просто нужно щелкнуть ссылку, чтобы перейти на другую страницу, но это не совсем правильно.

В идеале я хотел бы придерживаться хорошего стандарта для этого.Но я не уверен, где искать.

1 Ответ

2 голосов
/ 17 августа 2012

Я бы предложил попробовать немного другое поведение. В обработчике события buttonAccept_Click перенаправьте пользователя на страницу благодарности. В Page_Load этой страницы благодарности есть код для загрузки файла. Это очень легко реализовать и дает лучший опыт для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...