Response.WriteFile&的Response.Redirect

时间:2012-02-01 07:22:10

标签: asp.net .net http-headers

我正在发布网页网址 例如mysite.com/disclaimer/someinfo 此页面显示协议,如果用户单击“同意”按钮,则PDF文件将作为附件流式传输。

这样做的目的是用户可以共享此URL,但链接后的任何其他人也必须在下载文件之前阅读协议。实际文件没有URL,但保存在服务器的其他位置,因此下载文件的唯一方法是单击“[Agree]”按钮。

然而 - 我发现很难的是,点击按钮并开始下载之后,我希望页面“消失”。带按钮的页面保留在屏幕上。理想情况下,他们会被重定向回他们来自的页面。我渴望不需要javascript或cookies。引荐来源存储在初始页面加载到表单上的隐藏字段中。

我尝试了不同的方法,尝试在标题中写入307重定向,文件向用户发出警告,表明他们的帖子数据被重定向。我下面的代码仅适用于支持元刷新的浏览器(例如Firefox; IE7不支持Chrome / Safari)

我可以看到为什么这不起作用的逻辑。浏览器有一个响应,就是预期的文件。将文件发送给他们然后将浏览器重定向到另一个页面的正确方法是什么。感觉来自用户p.o.v.一旦他们点击按钮,这个“接受”页面就会消失。

我有:

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 / pop-ups等。 目前用户只需点击一个链接转到另一个页面,但这感觉不太正确。

理想情况下,我想遵循一个很好的标准。但我不确定在哪里看。

1 个答案:

答案 0 :(得分:2)

我建议尝试稍微不同的行为。在buttonAccept_Click事件处理程序上,将用户重定向到感谢页面。在这个感谢页面的Page_Load中有下载文件的代码。 这非常容易实现,并为用户提供了更好的体验。