使一个互操作办公室应用程序在 WebForms Web 应用程序中为所有用户保持活动状态(直到 IIS 重新启动 ASP



我有一个 ASP.NET 4.5 WebForms的Web应用程序,使用Microsoft.Office.Interop.Word将RDF/DOC/TXT转换为PDF文件。我想在应用程序的整个生命周期内保持一个Microsoft.Office.Interop.Word.Application实例处于打开状态(直到 IIS 重新启动)。原因是初始化初始化Application是资源密集型的。即使对于小型文档,尝试使用程序集转换文档也需要很长的周转时间(4-5 +秒),其中大部分都是Application.Start()Application.Quit()。我希望通过持久化应用程序本身,我将能够为我的用户增加文档转换吞吐量。

这是正确的方法吗?实现此目的的最佳方法是将Application存储为非静态类的static属性吗?我这样做的方式是否正确?

//@see: https://www.codeproject.com/Tips/592957/Converting-Document-Word-Excel
using Microsoft.Office.Interop.Word;
public class DocManager
{
//Microsoft.Office.Interop.Word.Application
private static Application msWordDoc = null;
// C# doesn't have optional arguments so we'll need a dummy value 
private static object oMissing = System.Reflection.Missing.Value;
//Microsoft.Office.Interop.Word.Document
private Document doc = null;
public DocManager()
{
if (msWordDoc == null)
{
//1 instance to be available to all users across multiple requests
msWordDoc = new Application
{
Visible = false,
ScreenUpdating = false
};
}
}   
}

当 .NET 应用程序停止/重新启动时,我希望确保 Word 互操作应用程序已关闭并正确释放 - 即使我的应用程序崩溃也是如此。我需要在哪里插入代码?CodeProject 中有这样一个例子:

try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(msWordDoc);
msWordDoc = null;
}
catch (Exception exReleaseObject)
{
msWordDoc = null;
//   Console.WriteLine(CMSResourceFile.REALESE_FAILED+ exReleaseObject);
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}

如果要确保 Word 进程正确完成,则需要立即释放所有基础 COM 对象。使用 System.Runtime.InteropServices.Marshal.ReleaseComObject 在完成使用 Outlook 对象后释放该对象。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null)以释放对该对象的引用。在系统地释放对象一文中阅读有关此内容的更多信息。您可能还会发现何时发布在 .NET 中开发的 Office 外接程序中的 COM 对象一文很有帮助。

请注意,Microsoft 当前不建议也不支持从任何无人参与、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)自动化Microsoft Office 应用程序,因为在此环境中运行 Office 时 Office 可能会表现出不稳定的行为和/或死锁。

如果要生成在服务器端上下文中运行的解决方案,则应尝试使用已安全执行无人参与的组件。或者,您应该尝试找到至少允许部分代码在客户端运行的替代方法。如果使用服务器端解决方案中的 Office 应用程序,则该应用程序将缺少成功运行所需的许多功能。此外,您将承担整体解决方案稳定性的风险。有关详细信息,请参阅 Office 服务器端自动化的注意事项一文。

作为解决方法,如果您只处理开放的 XML 文档,则可以考虑使用 Open XML SDK。或者考虑使用为服务器端执行设计的任何第三方组件。

相关内容

最新更新