Это веб-приложение установлено ниже каких-либо других приложений в дереве каталогов веб-сайта? Проверьте любого родителя web.config файлы для других настроек, если таковые имеются. Кроме того, сделайте Ваш свой каталог, установлен как каталог приложения в IIS.
Почему бы не создать класс StreamCollection, реализующий IDisposable:
public class StreamCollection : Collection<Stream>, IDisposable { }
В методе Dispose этого класса вы можете перебрать все потоки и правильно закрыть / удалить каждый поток. Тогда ваш код будет выглядеть так:
using (var reports = new StreamCollection())
{
//looping code for each users set of reports
reports.Add(ReportSource.ReportDocument.ExportToStream(PortableDocFormat));
//end looping codeSmtpClient
smtpClient = new SmtpClient(host, port);
MailMessage message = new MailMessage(from, to, subject, body);
foreach (Stream report in reports)
{
message.Attachments.Add(new Attachment(report, "application/pdf"));
}
smtpClient.Send(message);
}
Вы можете создать DisposableList, который можно обернуть в оператор using:
public class DisposableList<T> : List<T>, IDisposable where T : IDisposable {
// any constructors you need...
public void Dispose() {
foreach (T obj in this) {
obj.Dispose();
}
}
}
Выполнение Flush () / Close () не причинит никакого вреда. Если вы хотите быть абсолютно уверенным, вам следует выполнить using оператор:
using (Stream stream = ReportSource.ReportDocument.ExportToStream(PortableDocFormat))
{
reports.Add(stream);
stream.Flush(); //unsure
}
Таким образом, исключения не повлияют на ваш код.
Зависит от того, будут ли потоки использоваться позже при создании вложения. Я предполагаю, что это так, а это значит, что вы захотите избавиться от потоков в конце.
Не забудьте попробовать-наконец это. В противном случае они не будут удалены при возникновении исключения.
Я не вижу логики в закрытии потоков сразу после добавления их в список. Судя по предоставленному вами коду, ссылки на эти потоки используются в других местах. Если ручьи закрыты, то какая польза от них?