如何处理在ASP.NET中写入文件时出现的错误?

如何处理在ASP.NET中写入文件时出现的错误?,asp.net,Asp.net,我有一个页面应该用来传输文件 所有代码都包含在try/catch异常块中 我使用Response.TransmitFile实际编写文件,当文件失败时(在我的情况下是由于权限问题),对客户端的响应是一些自动生成的html,其中详细说明了错误,其中一部分说:“在执行当前web请求期间生成了未处理的异常。” 为什么它会说未处理的异常 我发现了这个错误,因为头被更改为text/html,而不是八位字节流。如果文件成功运行,它将被设置为八位字节流。但是对TransmitFile的调用似乎将自己的内容写入响

我有一个页面应该用来传输文件

所有代码都包含在try/catch异常块中

我使用Response.TransmitFile实际编写文件,当文件失败时(在我的情况下是由于权限问题),对客户端的响应是一些自动生成的html,其中详细说明了错误,其中一部分说:“在执行当前web请求期间生成了未处理的异常。”

为什么它会说未处理的异常

我发现了这个错误,因为头被更改为text/html,而不是八位字节流。如果文件成功运行,它将被设置为八位字节流。但是对TransmitFile的调用似乎将自己的内容写入响应,然后刷新它,这确实是不可取的

我能做什么

try
{
    String targetFile = Request.Form["filePath"];
    if (targetFile == null) throw new Exception("No filename provided");
    FileInfo file = new FileInfo(targetFile); 
    if (!file.Exists)
    {
        // file not found error
        throw new Exception("File not found");
    }

        Response.ContentType = "APPLICATION/OCTET-STREAM";
        Response.AppendHeader("Content-Disposition", "Attachment; Filename=\"" + Path.GetFileName(targetFile) + "\"");

        Response.TransmitFile(file.FullName);

} 
catch (Exception e) 
{
    Response.ClearHeaders();
    Response.ClearContent();
    Response.ContentType = "text/html";

    StringBuilder sb = new StringBuilder();
    // I write my own response in sb - I never see this content sent back!!
    Response.Write(sb.ToString());
    Response.Flush();
}

这是我为让它重新工作所做的。这看起来像是一个黑客不过。。。啊

using (FileStream stream = file.OpenRead())
{

byte[] buffer = new byte[1];
int read = stream.Read(buffer, 0, buffer.Length);

if (read <= 0)
{
    throw new Exception("Access denied");
}

Response.ContentType = "APPLICATION/OCTET-STREAM";
Response.AppendHeader("Content-Disposition", "Attachment; Filename=\"" + Path.GetFileName(targetFile) + "\"");

Response.TransmitFile(file.FullName);


}  
使用(FileStream-stream=file.OpenRead())
{
字节[]缓冲区=新字节[1];
int read=stream.read(buffer,0,buffer.Length);

if(readResponse.TransmitFile)将文件直接写入响应流,而不进行缓冲

因为它已经被写入并发送到客户端,所以您不能在catch块中收回/清除头等等——一些响应已经发送到客户端

作为替代方案,您可以使用Response.WriteFile将文件缓冲到内存中(前提是您的Response.buffer属性或Response.BufferOutput设置为true)。这将允许您在发生异常时“收回”

请记住,这可能会对非常大的文件产生性能影响,因此请为您的场景选择最佳方法


file.FullName的值是什么?它是指向文件的Windows UNC路径,即\\server\folder\file.ext在Response.TransmitFile下面是否有其他代码?另外,为什么在附加头文件和TransmitFile之前不清除响应?不用担心。测试是无法替代的,但我想你的方法在哪里在传输文件之前,您尝试读取文件的第一个字节,它的性能可能优于WriteFile方法。对于较大的文件,我通常更喜欢TransmitFile。