IIS处理后使用OpenXML创建的Word文件继续被IIS锁定

时间:2016-08-17 15:07:03

标签: c# iis openxml openxml-sdk

我有一些带有.docm扩展名的单词模板,其中包含将被数据库中的实际值替换的标记化标识符。

我正在加载模板,克隆它并将文档类型从模板更改为文档,然后将其作为新文档保存到磁盘:

string templateFilePath = @"C:\TempDoc\Template.docm";

using (WordprocessingDocument template = WordprocessingDocument.CreateFromTemplate(templateFilePath))
{
    using (WordprocessingDocument document = (WordprocessingDocument)template.Clone())
    {
        document.ChangeDocumentType(WordprocessingDocumentType.Document);

        document.SaveAs(@"C:\TempDoc\Template.docx");
    }   
}

所有这些都有效,但新创建的文件仍然被W3WP进程锁定,然后无法读取并从服务中流回。

知道如何阻止IIS保留此文件吗?

可以在LinqPad中运行相同的代码,只要使用块超出预期范围,新文档就会立即解锁。

2 个答案:

答案 0 :(得分:3)

找到了解决方法:

        File.Copy(templateFilePath, documentFilePath, true);
        using (WordprocessingDocument document = WordprocessingDocument.Open(documentFilePath, true))
        {
            document.ChangeDocumentType(WordprocessingDocumentType.Document);

而不是使用离开锁的Clone和SaveAs,如果我复制模板,修改它并保存而不是SaveAs,则不会保持锁定。

谢谢!

答案 1 :(得分:0)

SaveAs()实际上与Clone()相同(请参阅Documentation)。因此,它不仅会创建文件,还会打开包,因此要解除锁定,您应该Close()

document.SaveAs(@"C:\TempDoc\Template.docx").Close();