C#BinaryReader无法访问已关闭的文件

本文关键字:文件 访问 C#BinaryReader | 更新日期: 2023-09-27 17:58:52

控制器:

private readonly Dictionary<string, Stream> streams;
        public ActionResult Upload(string qqfile, string id)
        {
            string filename;
            try
            {
                Stream stream = this.Request.InputStream;
                if (this.Request.Files.Count > 0)
                {
                    // IE
                    HttpPostedFileBase postedFile = this.Request.Files[0];
                    stream = postedFile.InputStream;
                }
                else
                {
                    stream = this.Request.InputStream;
                }
                filename = this.packageRepository.AddStream(stream, qqfile);
            }
            catch (Exception ex)
            {
                return this.Json(new { success = false, message = ex.Message }, "text/html");
            }
            return this.Json(new { success = true, qqfile, filename }, "text/html");
        }

添加流的方法:

        public string AddStream(Stream stream, string filename)
        {
            if (string.IsNullOrEmpty(filename))
            {
                return null;
            }
            string fileExt = Path.GetExtension(filename).ToLower();
            string fileName = Guid.NewGuid().ToString();
            this.streams.Add(fileName, stream);
        }

我正在尝试读取这样的二进制流:

Stream stream;
            if (!this.streams.TryGetValue(key, out stream))
            {
                return false;
            }
    private const int BufferSize = 2097152;
                            using (var binaryReader = new BinaryReader(stream))
                            {
                                int offset = 0;
                                binaryReader.BaseStream.Position = 0;
                                byte[] fileBuffer = binaryReader.ReadBytes(BufferSize); // THIS IS THE LINE THAT FAILS
    ....

当我在调试模式下查看流时,它显示它可以是read=true、seek=true、lengt=903234等。

但我不断得到:无法访问关闭的文件

当我在本地/调试模式(VSIIS)下运行mvc站点时,这可以很好地工作,而在"RELEASE"模式下(当站点发布到IIS时)则不起作用。

我做错了什么?

C#BinaryReader无法访问已关闭的文件

在此处找到解决方案:

上传文件异常

解决方案:

在生产环境上添加"requestLengthDiskThreshold"

<system.web>
<httpRuntime executionTimeout="90" maxRequestLength="20000" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/>
</system.web>

您似乎依赖于不控制的对象的生存期(HttpRequest对象的属性)。如果你想存储流的数据,那么立即将数据复制到字节数组或类似的会更安全

您可以将AddStream更改为

    public string AddStream(Stream stream, string filename)
    {
        if (string.IsNullOrEmpty(filename))
        {
            return null;
        }
        string fileExt = Path.GetExtension(filename).ToLower();
        string fileName = Guid.NewGuid().ToString();
        var strLen = Convert.ToInt32(stream.Length);
        var strArr = new byte[strLen];
        stream.Read(strArr, 0, strLen);
        //you will need to change the type of streams acccordingly
        this.streams.Add(filename,strArr); 
    }

然后,当您需要流的数据时,您可以使用该数组,这使您可以完全控制对象的生存期-数据存储在中