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