Возможно, вы уже нашли проблему, но вот что я нашел.
Есть несколько FileStream open , которые никогда не использовались . Потоки emc
, eqc
, fmc
, fqc
открываются при каждом вызове функции, только 1 Утилизируется , поэтому при втором вызовенекоторые файлы по-прежнему being used by another process
Чтобы упростить отладку, я всегда начинаю удалять дублирование кода , в основном ваша функция имеет в 4 раза больше того же блока кода идентичен на 99% кроме источника inputStream
.
Из вашего кода я также заметил, что этот блок кода всегда будет возвращать null inputStream
...
using (Stream inputStream = eqc) {
MemoryStream memoryStream = inputStream as MemoryStream; //eqc is a FileStream, it is not castable as MemoryStream, This is always null
...
Решение
Вот небольшой рефактор вашей функции. Я удалил unused variables
и приблизил определение переменной к использованию. Вы также заметите, что не осталось ни одного оператора if ()
(Directory.CreateDirectory()
не сгенерирует исключение, если каталог уже существует).
Мое правило для лучшего кода : Удалите как можно больше [если], это уменьшит пути к коду и вероятность ошибок.
public ActionResult EditPersonalityTest([Bind(Include = "ID,EnglishProefficiencyBefore")] Recipient recipient, CohortSubscriptions cohortSubscriptions)
{
var property = db.CohortSubscriptions.Where(x => x.ID == cohortSubscriptions.ID).FirstOrDefault();
property.EnglishProefficiencyBefore = cohortSubscriptions.EnglishProefficiencyBefore;
db.Entry(property).State = EntityState.Modified;
db.SaveChanges();
Registrations registration = db.Registrations.Where(x => x.ID == property.RegistrationId).FirstOrDefault();
recipient.Name = registration.FirstName + " " + registration.LastName;
recipient.Email = registration.Email;
//Array to map campus name to FileNamePart
var campusNameMap = new[] {
new { PreferredCampus = "Montreal", FileNamePart = "Montreal" },
new { PreferredCampus = "Québec", FileNamePart = "Quebec" },
};
//Generate pdfDocumentPath based on isEnglish and registration.PreferredCampus
string campusFileNamePart = campusNameMap.Single(campus => campus.PreferredCampus == registration.PreferredCampus).FileNamePart;
string languageFileNamePart = IsEnglishLocale(registration) ? "English" : "French";
//Use only 1 inputStream
using (FileStream inputStream = new FileStream(Server.MapPath($"~/Documents/Contrats {campusFileNamePart} {languageFileNamePart}.pdf"), FileMode.Open))
{
MemoryStream memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
string directorypath = Server.MapPath("~/App_Data/Files/");
Directory.CreateDirectory(directorypath);
string serverpath = $"{directorypath}{recipient.Name.Trim()}.pdf";
System.IO.File.WriteAllBytes(serverpath, memoryStream.ToArray());
docusignContract(serverpath, recipient.Name, recipient.Email);
System.IO.File.Delete(serverpath);
}
return View("ConfirmEditSubscriptions");
}
Надеюсь, это сработает для вас.