C# 大于10MB的C.Net文件流意外关闭
我有一个网站,它需要一个网页表单与多个上传得到电子邮件给某人。 为了解决这个问题,我们创建了一个临时文件流,它基本上将上传内容复制到文件系统中,并在释放时删除文件。 TemporaryFileStream继承Stream对象,诱使dotnet认为它实际上是一个流,这样我们就可以使用var attachment=new AttachmentfileStream,file.FileName,file.ContentType;为了电子邮件。 我遇到的问题是,当文件大于10 MB或文件总数大于10 MB时,会出现System.IO错误,表示您无法访问已关闭的文件。 我不明白为什么只有当大小大于10 MB时才会发生这种情况,这不是上载,因为HttpPostedFileBase正确发送,错误发生在实际调用临时文件流上的“Read”方法时 以下是启动临时文件流的方式:C# 大于10MB的C.Net文件流意外关闭,c#,file-upload,C#,File Upload,我有一个网站,它需要一个网页表单与多个上传得到电子邮件给某人。 为了解决这个问题,我们创建了一个临时文件流,它基本上将上传内容复制到文件系统中,并在释放时删除文件。 TemporaryFileStream继承Stream对象,诱使dotnet认为它实际上是一个流,这样我们就可以使用var attachment=new AttachmentfileStream,file.FileName,file.ContentType;为了电子邮件。 我遇到的问题是,当文件大于10 MB或文件总数大于10 MB
/// <summary>
/// A temporary fileStream that is removed when disposed
/// </summary>
/// <param name="file">The HttpPosted file to write to the temp directory</param>
public TemporaryFileStream(HttpPostedFileBase file)
{
file.InputStream.Flush();
file.InputStream.Position = 0;
_tempPath = Path.Combine(Path.GetTempPath(), String.Join(".", Path.GetRandomFileName(), file.FileName));
_innerStream = File.Create(_tempPath);
file.InputStream.CopyTo(_innerStream);
_innerStream.Flush(true);
_innerStream.Position = 0;
_innerStream.Unlock(0,_innerStream.Length);
}
这是唯一一个调用Close的地方,但它在发送邮件后会被调用
我很确定这不是httpRuntime.maxRequestLength设置,因为我们已经将其设置为:512000
我甚至尝试过以下方法,但都没有成功:
httpRuntime maxRequestLength="512000" executionTimeout="3600"
appRequestQueueLimit="100" requestLengthDiskThreshold="10024000"
enableKernelOutputCache="false" relaxedUrlToFileSystemMapping="true" />
是否有任何原因可以在我无法控制的情况下关闭我的文件流?或者SendMail…ConfigureAsynctrue的异步上下文是否与此有关
致以亲切的问候,
马文·布鲁沃。我已经解决了这个问题。
结果表明,它是碱的组合;和
httpRuntime maxRequestLength=512000执行超时=3600
appRequestQueueLimit=100 RequestLength DiskThreshold=1002400
enableKernelOutputCache=false relaxedUrlToFileSystemMapping=true/>
显然是基地。处置;试图关闭未打开的流,RequestLength DiskThreshold等在读取时关闭了文件流。您没有显示调用SendMail的代码?在实现Dispose时,您应该增加maxRequestLength。我不知道你为什么会有新的关键词…我已经更新了我的答案来澄清你的问题@GaryMcGill new关键字是因为类继承的是dotnet Stream类。@Marvinbrower:那么您肯定想要覆盖,而不是新的,因为否则如果任何框架代码调用Dispose,它将调用基类版本,而不是您的版本?
httpRuntime maxRequestLength="512000" executionTimeout="3600"
appRequestQueueLimit="100" requestLengthDiskThreshold="10024000"
enableKernelOutputCache="false" relaxedUrlToFileSystemMapping="true" />