C# BinaryReader Не удается получить доступ к закрытому файлу

Контроллер:

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
    ....

Когда я смотрю поток в режиме отладки, он показывает, что он может быть прочитан = true, искать = true, длина = 903234 и т. Д.

но я продолжаю получать:не могу получить доступ к закрытому файлу

Это прекрасно работает, когда я запускаю сайт mvc локально / режим отладки (VS IIS) и НЕ РАБОТАЕТ, когда находится в режиме "РЕЛИЗ" (когда сайт публикуется в iis).

Что я делаю неправильно?

2 ответа

Решение

Нашел решение здесь:

исключение при загрузке файла

Решение:

добавить "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); 
    }

затем вы можете использовать массив, когда вам нужны данные потока, что дает вам полный контроль над временем жизни объекта, в котором хранятся данные

Другие вопросы по тегам