ASP.NET“application/pdf”:代码只运行一次

问题描述:

我正在使用SharePoint 2013网站,并添加了以PDF格式保存网页的功能。 PDF转换由第三方库SelectPdf处理。 除了在我的页面上使用的“PDF下载”按钮只能执行一次外,我设法让所有内容都能正常工作(渲染和文件下载)。意思是,无论我点击多少次按钮(注意,我以10+秒的间隔点击它),后面的代码上的点击事件只会触发一次。如果我想再次下载PDF文件,我必须刷新页面。 我放在一起的“Hello World”的例子(见下文),以查明问题:ASP.NET“application/pdf”:代码只运行一次

protected void lnkPdfDownload_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.ContentType = "application/pdf"; 
    Response.AddHeader("content-disposition", "attachment;filename=test.pdf"); 

    /************************************ Create PDF File ************************************/ 
    string html = @"<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN"" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd""> 
        <html dir=""ltr"" lang=""en-US""> 
        <body><h1>Hello World</h1></body> 
        </html>"; 
    HtmlToPdf converter = new HtmlToPdf(); 
    PdfDocument doc = converter.ConvertHtmlString(html); 
    byte[] bytes = doc.Save(); 
    Response.OutputStream.Write(bytes, 0, bytes.Length); // ALTERNATIVE: doc.Save(Response.OutputStream); 
    /************************************ Create PDF File ************************************/ 

    //Response.End(); // This throw a ThreadAbortException, therefore I'm using the alternative code below 
    Response.Flush(); 
    Response.SuppressContent = true; 
    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
} 

当时我还以为是Response.End()引起的问题(抛ThreadAbortException)开始,但我取代它与其他代码,我仍然有同样的问题(现在没有例外抛出)。我不认为问题出现在SelectPdf库中:我可以注释掉整个块(在“创建PDF文件”注释之间),并且我仍然会得到相同的结果(显然不会生成PDF)。

我注意到,我最多可以成功点击2次“下载”按钮(这很少见,也不一致):第三次没有任何反应。

虽然这不是一个大问题,但我认为我看不到有什么问题。这是为什么:在我点击“下载”按钮(并获取我的PDF文件)后,我无法继续在我的SharePoint页面中进行编辑模式。 “加载”消息不断旋转,但没有任何反应(再次,除非我刷新页面)。

有没有人有这个问题?我在网上查找,但我无法找到任何有关它。 我使用Internet Explorer 11和Chrome 51.请让我知道是否需要更多信息。谢谢。

当下载按钮被点击时,你确定没有javascript/jquery错误发生,以防止重新点击PDF按钮,并进入编辑模式? 尤其是因为刷新页面会使所有的工作重新开始。

+0

我启用了打破所有异常(在IE中)的选项,但我没有看到任何JavaScript错误被抛出。我注意到如果我删除了所有的响应代码,那么事件就会一直被触发。 – Frederic