`
kodo521
  • 浏览: 9255 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

将生成的word文档,作为mail的附件发送。报错!

    博客分类:
  • c#
阅读更多
[size=medium]
现象简述:
将生成的word文档,作为mail的附件发送给客服部门。连续点击发送按钮报错。一般点击到第2,3次时报错。(winform)
在发现这个错误时我有点不解因为
a.c#生成word开发过,
b.c#发送mail开发过。
c.二者结合是再正常不过的业务需求也开发过(控制台程序)
纠结…………
好了找错吧!
主要程序代码
 fileName = Func_cfg.getBakPath() + fileName;
 string dotName = Func_cfg.getTemplatePath() + "工单.dot";
 WordUtility wordUtility = new WordUtility(dotName);
 wordUtility.createWordDocment();
 wordUtility.replaceItems(ht);
 wordUtility.saveAs(@fileName);//这句报错 文件只读
 wordUtility.close();
   //发送报表
    SendReport(fileName);

1.怀疑程序写法问题,导致word进程没有被关闭。
 wordUtility.close();
wordUtility类的close方法如下
      public void close()
        {
            object o = false;
            oDoc.Close(ref o, ref oMissing, ref oMissing);
            oDoc = null;
            oWord.Quit(ref o, ref oMissing, ref oMissing);
            oWord = null;
        }
查看任务管理器,在错误发生前,没有未关闭的进程。  
又查了一下参数的意义,觉得问题不在这里。
  


2.调查了一下saveas()方法参数意义 也没有发现问题
3.在同事的帮助下修改了写法
    fileName = Func_cfg.getTempPath() + fileName;
    string bakFilePath = Func_cfg.getBakPath() + fileName;
    string dotName = Func_cfg.getTemplatePath() + "工单.dot";
    WordUtility wordUtility = new WordUtility(dotName);
    wordUtility.createWordDocment();
    wordUtility.replaceItems(ht);
    wordUtility.saveAs(@fileName);
    wordUtility.close();
    SendReport(fileName);
     MyUtility.copyFile(fileName, bakFilePath, true);
     MyUtility.deleFile(fileName);//这句报错 说文件被打开


貌似跟1一样
MyUtility.deleFile(fileName);

前移如下
wordUtility.close();
MyUtility.deleFile(fileName);//断点放在这句
SendReport(fileName);

执行到断点处时一切正常,由此判断word生成没有问题,问题出在发送mail的方法
SendReport里,再根据经验推断,很可能附件语句占用了word文档进程。
sMTPUtility.addAttachment(fullFileName);

  4.找到问题的所在开始想解决方法。
MailMessage message = new MailMessage ();
message .Dispose();

不起作用
5.到网上查。也有人遇到此问题。但未找到解决方法,不过还是找到了点解决思路。
网上说stream没有关闭。可是保存附件时并没有打开stream?难道是dot添加附件是自己打开的?
下面能做是尽快找到关闭流的方法。
还好找到了,遍历后关闭。
 this.message.Attachments[i].ContentStream.Close();

6.测试后,一切ok。
7.思考:上面c中提到程序为何没有发生?也曾经对一个word文档多次发送?
  原来c是控制台程序运行完一次就释放了。
8.致谢:感谢同事,“感谢”微软。
分享到:
评论
1 楼 ti_tian 2011-08-18  
很有帮助  

相关推荐

Global site tag (gtag.js) - Google Analytics