0

我得到以下代码

protected override void Render(HtmlTextWriter writer) 
{

    // Write the HTML into this string builder

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter hWriter = new HtmlTextWriter(sw);
    base.Render(hWriter);

    string pageHTML = sb.ToString(); 

    // Write it back to the server
    writer.Write(pageHTML);
    if (Convert.ToBoolean(this.ViewState["SendEmail"])) 
    {
        string HTML = "";
        HTML = "<!DOCTYPE HTML PUBLIC '-//IETF//DTD HTML//EN'>";
        HTML += "<html>";
        HTML += "<head>";
        HTML += "<meta http-equiv='Content-Type'";
        HTML += "content='text/html; charset=iso-8859-1'>";
        HTML += "<title>Order Information</title>";
        HTML += "</head>";
        HTML += "<body>";
        HTML += "See attachment for information.";
        HTML += "</body>";
        HTML += "</html>";

        MailMessage mail = new MailMessage("from@xxx.com", "to@xxx.com", "Subject", HTML);
        mail.IsBodyHtml = true;

        string path = @"d:\websites\plate.html";

        using (StreamWriter sw11 = File.CreateText(path))
        {
            sw11.WriteLine(pageHTML);
        }

        mail.Attachments.Add(new Attachment(path));

        SmtpClient client = new SmtpClient("192.168.1.127");

        client.Send( mail );

        Response.Write("<script>alert('Your information has been sent.')</script>");

        this.ViewState["SendEmail"] = false;
    }

}

在重新清理/构建我的解决方案后,当我按下发送按钮时,会调用此函数,并且 html 页面会通过邮件以附件形式发送,没有问题。但是,如果我再次尝试按下发送按钮,我会收到“System.IO.IOException:该进程无法访问文件 'd:\websites\plate.html',因为它正被另一个进程使用。” 当我尝试打开文件时发生错误。怎么了?

4

3 回答 3

2

SmtpClient 实现 IDisposable 但您没有释放实例。

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

出于这个原因,它可能会保留该文件。

一般来说,将实现 IDisposable 的任何内容包装在using语句中是明智的,除非您有特定的理由不这样做(例如,您正在通过持有 IDisposable 实例的类显式管理对象生命周期)。

我还想提请注意@DanPichelman 的评论,即您使用的是常量文件名,但此代码可能会在单独的线程上并行执行。这将导致为第一个用户之后的任何用户锁定输出文件,直到第一个用户的代码完成。

于 2012-08-29T17:50:14.203 回答
1

正如 Eric 指出的那样,您应该SmtpClientusing声明中包含 - 同上MailMessage

但是,您仍然会无缘无故地写入文件系统。我强烈建议您使用不需要文件开始的构造函数Attachment之一。您可以写入 a ,将其倒回,然后将其提供示例。MemoryStreamAttachment

除此之外,这意味着如果多个线程(或进程)尝试同时运行此代码,您不会有问题。

于 2012-08-29T17:53:28.510 回答
-2

我认为你应该关闭它:

using (StreamWriter sw11 = File.CreateText(path))
{
    sw11.WriteLine(pageHTML);
    sw11.Flush();
    sw11.Close();
}
于 2012-08-29T17:50:43.967 回答