仅在尝试使用Word DocumentClass时在prod中获取对象引用错误

我正在编写一个使用.dotx模板的程序,并在aspx页面中进行数据合并。 该程序在我的开发工作站本地工作完美,但当我将它部署到测试IIS服务器时,它在下面的第二行失败,给我一个对象参考错误。

我之前遇到问题,因为Word Com对象不在IIS服务器上,因此我将Word加载到服务器上并在DCom中设置权限并解决了该问题。 但现在我在以wRange = …..开头的行上出现此错误

正如我所说,该程序在调试模式下完美地工作。

有任何想法吗?

Microsoft.Office.Interop.Word.DocumentClass System.NullReferenceException: Object reference not set to an instance of an object 

代码行:

 Document BaseDocument = oWord.Documents.Open(ref oTemplate, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); wRange = BaseDocument.Bookmarks.get_Item(ref endOfDoc).Range; 

  1. 单击开始,单击程序,单击管理工具,单击组件服务。
  2. 展开“组件服务”,展开“计算机”,展开“我的电脑”,展开“DCOM配置”,然后右键单击“ Microsoft Word 97 – 2003文档” 。 选择属性。
  3. 单击常规。 将身份validation级别设置为连接(无也可以)。
  4. 单击标识。 设置此用户 。 指定始终用于运行COM应用程序的用户帐户,无论哪个用户正在访问它。
  5. 单击应用按钮。
  6. 单击按钮确定。

有关“配置DCOM以进行远程访问”的详细信息,请访问配置DCOM以进行远程访问

如果确实在服务器上安装了word,请检查运行IIS的用户帐户是否具有Microsoft.Office.Interop程序集的实际权限

在目标计算机上安装Office后,请确保直接打开Word之类的应用程序,因为可能会有更多提示来激活许可证。 在您逐步完成此过程之前,API将无法运行,并且生成的错误将无法确定问题的真正原因。

因此,NullReferenceException可能是由Word无法打开文档引起的,因此Word.Documents.Open()将返回null。 说实话,我并不是100%确定这是导致问题的原因 – 正如我所说,错误不会清楚地告诉你问题是什么。 (我不久前遇到过这种情况,虽然我知道API抛出一个exception但我不记得它是否和你所看到的一样。)

您的程序在调试模式下无法在本地运行。 你根本没有行使任何错误。

在任何情况下,您都不应使用ASP.NET应用程序或任何其他服务器应用程序中的任何Office Automation API。 这些API旨在调用交互式桌面应用程序。 他们做出的许多假设都不适用于服务器应用程序。

例如,桌面应用程序通过用户操作在Windows消息队列中成为消息来同步。 ASP.NET应用程序中没有Windows消息队列,因此不会同步对共享数据的访问。 您的测试可能根本不会导致多个线程同时运行。

对于给定COM组件的所有用户,可能只有一个副本中存在数据。 这在桌面应用程序中工作正常,因为只有一个用户。 您的ASP.NET应用程序有许多用户同时执行代码。 另一个假设违反了。

所有这些都会产生微妙的错误,实际上无法修复。 它们只能被移动,让你认为你已经解决了问题,直到你意识到还有一个问题。 这个循环永远不会结束,永远不会结束,因为您无法解决实际问题:问题在于您使用的是来自服务器应用程序的Office Automation API。

解决这个问题,你将不再有这种错误。


PS除非您的ASP.NET应用程序的所有用户都拥有Word应用程序的许可证,否则您可能违反了Microsoft Word许可证。