C# 将word文档转换为html时Asp.net页面挂起

C# 将word文档转换为html时Asp.net页面挂起,c#,html,asp.net,ms-word,office-interop,C#,Html,Asp.net,Ms Word,Office Interop,我有一个用于将word文档保存为html文件的函数,作为基于web的文档查看器的一部分。它返回新创建的html文件的路径,然后在iframe中显示该文件。我已将其内容粘贴到下面以供参考 当我从VisualStudio运行web应用程序时,这一切都很好,但当它安装在IIS上时,它只是挂起。未创建html文件 在这种情况之前,函数只能实例化word应用程序类;我收到一个错误,大致如下: “由于以下错误,检索组件{Guid thing}的COM类工厂失败…” 通过转到组件服务-->计算机-->我的计算

我有一个用于将word文档保存为html文件的函数,作为基于web的文档查看器的一部分。它返回新创建的html文件的路径,然后在iframe中显示该文件。我已将其内容粘贴到下面以供参考

当我从VisualStudio运行web应用程序时,这一切都很好,但当它安装在IIS上时,它只是挂起。未创建html文件

在这种情况之前,函数只能实例化word应用程序类;我收到一个错误,大致如下:

“由于以下错误,检索组件{Guid thing}的COM类工厂失败…”

通过转到组件服务-->计算机-->我的计算机-->DCOM配置解决了这个问题。我访问了Microsoft Word 97-2003文档的安全属性,并向IIS用户/网络服务授予了本地启动和本地激活的权限。后来,我还授予了远程启动远程激活权限

当我试图查看文档时,我在任务管理器的“进程”下看到WINWORD.exe已被网络服务打开。所以它比以前更进一步了。但现在我觉得它要么挂在wordApp.Documents.Open行上,要么挂在doc.SaveAs行上。我已经让它在某个点上运行了十分钟,但没有超时,也没有显示错误

web应用程序安装在Windows Server 2003 SP2上的IIS 6中

private string WordToHTML(string filePath)
{
    string returnPath = String.Empty;
    Microsoft.Office.Interop.Word.Document doc = null;
    object missing = System.Reflection.Missing.Value;
    Microsoft.Office.Interop.Word.Application wordApp = null;

    try
    {
        // Initialise
        string serverFolderPath = Path.GetDirectoryName(filePath);
        string fileToOpen = filePath;
        string FileToSave = Path.GetFileNameWithoutExtension(fileToOpen) + ".html";

        // Open Word
        wordApp = new Microsoft.Office.Interop.Word.Application();

        // Get Doc
        doc = wordApp.Documents.Open(fileToOpen, ref missing, true, ref missing, 
                                     ref missing, ref missing, ref missing, 
                                     ref missing, ref missing, ref missing, 
                                     ref missing, false, ref missing, ref missing, 
                                     ref missing, ref missing);

        // If html file already exists, delete it 
        returnPath = String.Format("{0}\\{1}", serverFolderPath, FileToSave);  
        if (File.Exists(returnPath))
            File.Delete(returnPath);

        // Save as HTML document
        doc.SaveAs(returnPath, 10, ref missing, ref missing, 
                   ref missing, ref missing, ref missing, ref missing, 
                   ref missing, ref missing, ref missing, ref missing, 
                   ref missing, ref missing, ref missing, ref missing);
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        doc.Close(ref missing, ref missing, ref missing);
        wordApp.Quit(ref missing, ref missing, ref missing);
    }
    return returnPath;
}

从代码中使用任何MS Office产品都极易出现此类问题,而且(尽管建议可能很难)您确实应该不惜一切代价避免在这里所做的事情

您很可能遇到“无声ui提示”。屏幕上应该有一个UI提示来响应,但由于执行上下文/以及您没有登录到相关机器的事实,它永远不会出现

在此表单中使用MS Office stuff时遇到的其他问题包括处理对象时。如果你不能做到100%完美,那么你的应用程序中会有大量内存泄漏,随着时间的推移,它会不断下降。我发现,如果您编写的代码从不将调用链接在一起,并且总是在使用每个对象之前将其分配给一个变量,那么这可能会稍微容易实现(因为您可以专门处理每个对象)

您还应该考虑将文档格式从97/2003升级到Office 2007以后的xml格式。文件大小明显更好,并且与可能为您提供web查看的最新产品更兼容


您应该问,完成这项工作(正确且可靠)的成本是否会比简单地使用Microsoft自己的“Office Web应用程序”便宜,您可以通过企业内的SharePoint或Office 365访问这些应用程序,后者的成本极具竞争力,而且比“完美的Web浏览”要便宜得多.

我启动了process explorer并进行了一次gander。当请求通过winword时,其状态显示为“Wait:WrUserRequest”,这看起来像是给了一个提示,正如你所说。但我不明白的是,当我在我的开发环境中运行它,并且winword在本地用户帐户下运行时,一切都很好。在任何情况下,我似乎都必须找到另一种选择,也许只是提供文档供下载或其他什么。谢谢。Office就是这样设计的作为当前用户上下文运行。它实际上不是设计为在没有该上下文的情况下执行的。