Skip to main content
 首页 » 编程设计

c#之返回 Web 窗体中等效的文件

2024年04月12日42kerrycode

我的 MVC C# 应用程序中有以下代码:

      return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "PSL.xlsx");  

从流中返回 PSL 文件。我正在尝试在我的 Web 窗体代码中做同样的事情:

            Response.Clear(); 
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
            Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
            Response.BinaryWrite(stream.ToArray()); 
            // myMemoryStream.WriteTo(Response.OutputStream); //works too 
            Response.Flush(); 
            Response.Close(); 
            Response.End(); 

想知道这是否是正确的方法,因为我收到以下错误消息:

  Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack.} 

请您参考如下方法:

该错误是由调用 Response.End(); 时抛出的 ThreadAbortException 引起的。看看这个 question .

基于您有 Response.End(); 调用这一事实,我假设您包含的代码正在 ASPX 页面的事件中运行。正确吗?

如果是这样,我建议您将加载文件的代码移到ASPX 页面并将其提供给客户端,移到通用处理程序 中。通用处理程序具有 ASHX 文件扩展名。它非常简单——它只有一种方法和一个您需要实现的属性。最主要的是 ProcessRequest 方法。来自名为 ServeFile.ashx 的处理程序的示例:

public class ServeFile : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
        byte[] fileBytes = File.ReadAllBytes("c:\\path\\to\\folder\\with\\files\\" + context.Request.QueryString["fileName"]); 
        context.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
        context.Response.AddHeader("Content-Disposition", "attachment; filename=PSL.xlsx"); 
        context.Response.BinaryWrite(fileBytes); 
    } 
 
    public bool IsReusable 
    { 
        get 
        { 
            return false; 
        } 
    } 
} 

构建处理程序后,您可以更改 aspx 页面以显示指向处理程序的链接,该链接在 QueryString 中具有合适的标识符,处理程序用于加载和提供正确的文件。在示例中,文件是从文件系统中读取的,但您当然可以从数据库中加载它,也可以通过其他方式获取它。