System.Mail.Net 尝试添加附件时无法访问已关闭的文件异常
System.Mail.Net cannot access closed file Exception when trying to add an attachment
大家好,我正在尝试向电子邮件添加附件,但我收到了这个奇怪的异常,不清楚我做错了什么。
我正在从文件输入表单中获取附件
<div class="form-group">
<br/>
Select any files to attach to email
<div class="input-group">
<label class="input-group-btn btn btn-default btn-file" id="attachFiles">
Upload <input type="button" id="attach" name="Upload" style="display: none" value="Upload"/>
</label>
<label class="input-group-btn btn btn-default btn-file">
Browse <input type="file" id="attachInput" multiple="false" style="display: none"/>
</label>
<input type="text" disabled="disabled" id="attachText" class="form-control input-group-addon"/>
</div>
<br/>
<ul id="issueFormAttachName" class="list-group list-inline"></ul>
然后我通过请求获取这些文件并将它们存储在 public 变量中以便稍后通过不同的控制器访问它们
[HttpPost]
[Route("home/saveAttachment")]
public ActionResult SaveAttachment()
{
try
{
EmailAttachments = new EmailAttachments
{
FileCollectionBase = Request.Files
};
return Json("Ok");
}
catch (Exception ex)
{
return Json("Error occurred. Error details: " + ex.Message);
}
}
在此之后,我将调用我的控制器使用此文件发送电子邮件
string usersToReceived = "";
EmailMessage email = new EmailMessage
{
InnerHtmlBody = emailDto.EmailBody,
Subject = $"Support enquiry ticket number #{issueId}",
EmailHeader = "Thank you for contacting support"
};
emailDto.Users.ForEach(u => usersToReceived += u + ";");
Dictionary<string, Stream> streams = new Dictionary<string, Stream>();
//Check if attachments exist
if (HomeController.EmailAttachments?.FileCollectionBase.Count > 0)
{
foreach (string streamName in HomeController.EmailAttachments.FileCollectionBase)
{
streams.Add(streamName, HomeController.EmailAttachments.FileCollectionBase[streamName].InputStream);
}
foreach (string file in HomeController.EmailAttachments.FileCollectionBase)
{
//make sure stream is not disposed untill send is done
//Streams dont need to be explicitly disposed
email.AddAttachment(streams[file], file, HomeController.EmailAttachments.FileCollectionBase[file]?.ContentType);
}
}
email.Send(usersToReceived);
}
添加附件方法只是调用本机附件构造函数(New Attachment(_ms, fileName, mediaType)
现在,有时当我清除缓存并尝试使用上面的代码时,这会起作用,但大多数时候,这会抛出异常,错误为无法访问已关闭的文件,有人知道这里发生了什么吗?我确实尝试过在最后使用一个清晰的缓存方法,但这没有用
这是 asp.net mvc pipeline 技巧:
控制器中的每个动作都是通过反射调用的,因此,它们的管道是不同的。
当您首先 将Request.Files
存储在您的静态变量中时 - 它仅在管道未死 时才可用。
接下来,您调用另一个操作,并且您的 请求变量不同,因此,它们不再存储 Files
属性。
为避免这种情况,您需要在请求之间存储数据:数据库、静态变量或类似的东西。
大家好,我正在尝试向电子邮件添加附件,但我收到了这个奇怪的异常,不清楚我做错了什么。 我正在从文件输入表单中获取附件
<div class="form-group">
<br/>
Select any files to attach to email
<div class="input-group">
<label class="input-group-btn btn btn-default btn-file" id="attachFiles">
Upload <input type="button" id="attach" name="Upload" style="display: none" value="Upload"/>
</label>
<label class="input-group-btn btn btn-default btn-file">
Browse <input type="file" id="attachInput" multiple="false" style="display: none"/>
</label>
<input type="text" disabled="disabled" id="attachText" class="form-control input-group-addon"/>
</div>
<br/>
<ul id="issueFormAttachName" class="list-group list-inline"></ul>
然后我通过请求获取这些文件并将它们存储在 public 变量中以便稍后通过不同的控制器访问它们
[HttpPost]
[Route("home/saveAttachment")]
public ActionResult SaveAttachment()
{
try
{
EmailAttachments = new EmailAttachments
{
FileCollectionBase = Request.Files
};
return Json("Ok");
}
catch (Exception ex)
{
return Json("Error occurred. Error details: " + ex.Message);
}
}
在此之后,我将调用我的控制器使用此文件发送电子邮件
string usersToReceived = "";
EmailMessage email = new EmailMessage
{
InnerHtmlBody = emailDto.EmailBody,
Subject = $"Support enquiry ticket number #{issueId}",
EmailHeader = "Thank you for contacting support"
};
emailDto.Users.ForEach(u => usersToReceived += u + ";");
Dictionary<string, Stream> streams = new Dictionary<string, Stream>();
//Check if attachments exist
if (HomeController.EmailAttachments?.FileCollectionBase.Count > 0)
{
foreach (string streamName in HomeController.EmailAttachments.FileCollectionBase)
{
streams.Add(streamName, HomeController.EmailAttachments.FileCollectionBase[streamName].InputStream);
}
foreach (string file in HomeController.EmailAttachments.FileCollectionBase)
{
//make sure stream is not disposed untill send is done
//Streams dont need to be explicitly disposed
email.AddAttachment(streams[file], file, HomeController.EmailAttachments.FileCollectionBase[file]?.ContentType);
}
}
email.Send(usersToReceived);
}
添加附件方法只是调用本机附件构造函数(New Attachment(_ms, fileName, mediaType)
现在,有时当我清除缓存并尝试使用上面的代码时,这会起作用,但大多数时候,这会抛出异常,错误为无法访问已关闭的文件,有人知道这里发生了什么吗?我确实尝试过在最后使用一个清晰的缓存方法,但这没有用
这是 asp.net mvc pipeline 技巧:
控制器中的每个动作都是通过反射调用的,因此,它们的管道是不同的。
当您首先 将Request.Files
存储在您的静态变量中时 - 它仅在管道未死 时才可用。
接下来,您调用另一个操作,并且您的 请求变量不同,因此,它们不再存储 Files
属性。
为避免这种情况,您需要在请求之间存储数据:数据库、静态变量或类似的东西。