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);
}
затем вы можете использовать массив, когда вам нужны данные потока, что дает вам полный контроль над временем жизни объекта, в котором хранятся данные