1

我正在向我的网站用户推送 PEM 文件以供下载。这是代码:

try
{
    FileStream sourceFile = null;

    Response.ContentType = "application/text";
    Response.AddHeader("content-disposition", "attachment; filename=" + Path.GetFileName(RequestFilePath));
    sourceFile = new FileStream(RequestFilePath, FileMode.Open);
    long FileSize = sourceFile.Length;
    byte[] getContent = new byte[(int)FileSize];
    sourceFile.Read(getContent, 0, (int)sourceFile.Length);
    sourceFile.Close();
    Response.BinaryWrite(getContent);
}
catch (Exception exp)
{
    throw new Exception("File save error! Message:<br />" + exp.Message, exp);
}

问题是下载的文件也包含应该存在的内容 + 整个网页 HTML 的副本。

这里发生了什么事?

4

3 回答 3

5

放置以下...

Response.Clear();

前...

Response.ContentType = "application/text";

更新

正如@Amiram 在他的评论中所说的那样(无论如何我正要添加自己)......

后...

Response.BinaryWrite(getContent);

添加...

Response.End();
于 2012-07-11T13:53:44.070 回答
3

添加这一行:

Response.ClearContent();
Response.ContentType = "application/text";
...
于 2012-07-11T13:54:41.080 回答
0

我同意@Amiram Korach 的解决方案
也就是Response.ClearContent();之前添加Response.ContentType...

但根据你的评论

仍然写了整个页面

@Amiram Korach 在最后回复添加Response.End()
但它抛出System.Threading.ThreadAbortException

所以我建议你添加额外catch的 catchSystem.Threading.ThreadAbortException并且不要把错误信息放进去,Response.Write否则它也会被添加到你的文本文件中:

try
{
    FileStream sourceFile = null;
    Response.ClearContent(); // <<<---- Add this before `ContentType`.
    Response.ContentType = "application/text";
    .
    .
    Response.BinaryWrite(getContent);
    Response.End(); // <<<---- Add this at the end.
}
catch (System.Threading.ThreadAbortException) //<<-- Add this catch.
{
    //Don't add anything here.
    //because if you write here in Response.Write,
    //that text also will be added to your text file.
}
catch (Exception exp)
{
    throw new Exception("File save error! Message:<br />" + exp.Message, exp);
}

这将解决您的问题。

于 2012-11-28T06:17:01.137 回答