asp.net - Response.WriteFile & Response.Redirect

标签 asp.net .net http-headers

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

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

但是-我发现困难的是,在单击按钮并开始下载后,我希望页面“消失”。带有按钮的页面停留在屏幕上。理想情况下,他们会被重定向回他们来自的页面。我热衷于不需要 javascript 或 cookie。引用者存储在初始页面加载到表单上的隐藏字段中。

我尝试了不同的方法,尝试在标题中写入 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 等。
目前,用户只需单击一个链接即可转到另一个页面,但这感觉不太对劲。

理想情况下,我想为此遵循一个好的标准。但我不知道在哪里看。

最佳答案

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

关于asp.net - Response.WriteFile & Response.Redirect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9092265/

相关文章:

javascript - 检查是否启用了 Javascript,如果未使用 asp 自定义控件,则显示一条消息

c# - 从字符串中删除括号点和空格

c# - Silverlight:命名空间中不存在 Web

HTML5 视频在 IE 中播放失败(或 : Missing range request)

google-chrome - 如何绕过 Chrome 发送的 "Content-encoding gzip deflate" header ?

asp.net - 更快地创建 CSV 文件

c# - 使用不安全的每像素访问绘制位图会导致空图像

javascript - 从 Ajax HtmlEditor 获取解码/非 html

.net - 目标框架下拉列表为空

java - HTTP 响应显示 Accept=multipart/form-data 但未设置此 header 并设置 CamelAcceptContentType, "application/json"