所以我有一个页面,我在其中动态生成一个大型UpdatePanel内的表和链接按钮。单击时,每个链接按钮都将调用此方法。目标是让链接指向我的数据库中的文件,并在单击时允许用户打开/另存为该文件。这个确切的方法在我的网站的另一个页面上工作正常,通常具有相同的设置,但在这个我得到的:
Microsoft JScript运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应。 详细信息:在'%PDF-1.3附近解析时出错 % 1 0 ob'。
public void downloadFile(int fileID)
{
using (SurveyDataContext context = new SurveyDataContext())
{
try
{
var file = context.tblFiles.Single(f => f.FileID == fileID);
Response.Clear();
Response.Buffer = true;
Response.BufferOutput = true;
Response.ContentType = file.MIMEtype;
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + file.FileName.Trim() + "\"");
Response.AddHeader("Extension", file.FileName.Substring(
file.FileName.LastIndexOf('.') + 1).ToLower());
Response.BinaryWrite(file.FileData.ToArray());
Response.Flush();
Response.End();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.InnerException);
}
}
}
我做错了什么?我没有做任何Response.Writes或任何事情。这种方法是唯一触及Response的方法。还有其他方法我应该这样做吗?
答案 0 :(得分:0)
您应该在Response.End之前尝试Response.Flush,如果这不起作用,那么您在http://dotnetperls.com/response-binarywrite-aspnet
处有示例代码答案 1 :(得分:0)
您可能设置了错误的内容类型
答案 2 :(得分:0)
在其他所有内容之前调用Response.Clear();
是否会清除它?否则,here's a blog post会进行其他一些故障排除。
答案 3 :(得分:0)
我认为问题是由设置Response.Buffer和Response.BufferOutput引起的。 BufferOutput可能就是你想要的。
如果删除Response.Buffer不起作用,我会尝试通过设置ContentType =“application / octet-stream”并注释掉“Extension”标题来简化一点。仅对文件名的扩展名就足够了。
答案 4 :(得分:0)
我意识到我做错了什么...... 我需要让每个链接按钮都有一个PostBackTrigger。一旦我这样做,一切都按照原来的方式进行。
答案 5 :(得分:0)
你有UpdatePanel
或类似的东西吗?
如果是你的情况,那么你可以在页面加载时执行此操作:
ScriptManager _scriptManager = ScriptManager.GetCurrent(this.Page);
_scriptManager.RegisterPostBackControl(Button1);