Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 大于10MB的C.Net文件流意外关闭_C#_File Upload - Fatal编程技术网

C# 大于10MB的C.Net文件流意外关闭

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

我有一个网站,它需要一个网页表单与多个上传得到电子邮件给某人。 为了解决这个问题,我们创建了一个临时文件流,它基本上将上传内容复制到文件系统中,并在释放时删除文件。 TemporaryFileStream继承Stream对象,诱使dotnet认为它实际上是一个流,这样我们就可以使用var attachment=new AttachmentfileStream,file.FileName,file.ContentType;为了电子邮件。 我遇到的问题是,当文件大于10 MB或文件总数大于10 MB时,会出现System.IO错误,表示您无法访问已关闭的文件。 我不明白为什么只有当大小大于10 MB时才会发生这种情况,这不是上载,因为HttpPostedFileBase正确发送,错误发生在实际调用临时文件流上的“Read”方法时

以下是启动临时文件流的方式:

    /// <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" />