我正在编辑一个单词模板,然后将其保存在Web服务器上。为此,我使用Interop.Word
(我知道这很糟糕,但仍然......)
我在服务器上安装了MS Word
这是我的代码:
object fileName;
object saveAs;
fileName = Server.MapPath("~\\tempOutputs\\Template - Filled with Registration Data.docx");
try
{
object missing = System.Reflection.Missing.Value;
Word.Application wordApp = new Word.Application();
Word.Document aDoc = null;
if (File.Exists((string)fileName))
{
object readOnly = false;
object isVisible = false;
wordApp.Visible = false;
aDoc = wordApp.Documents.Open(ref fileName, ref missing,
ref readOnly, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref isVisible, ref missing, ref missing,
ref missing, ref missing);
aDoc.Activate(); //Error Line
我在aDoc.Activate()
声明中收到错误object reference not set to an instance
但它适用于我的系统
有什么建议吗?
修改
我使用上面的代码编写了一个控制台应用程序并在服务器上运行它运行完美那么为什么不在IIS上作为Web应用程序?
答案 0 :(得分:3)
我很久以前使用VSTO可能是7年或8年前,但不是在服务器端...而且我遇到了很多困难的流程,内存泄漏和奇怪的问题我的代码在某处工作而在其他地方不工作(如同你的)。 解决方案是OS语言和安装的Office语言不匹配。因此,您应该检查并检查您的代码文化信息:
Thread.CurrentThread.CurrentUICulture;
Thread.CurrentThread.CurrentCulture;
如果你真的需要VSTO(我不明白为什么??)检查语言,安装Office语言包,等等...但我也建议使用别的东西。
答案 1 :(得分:1)
整个方法都错了.. 在服务器端操作word文档应该只使用open xml或类似的框架来完成,这些框架基本上是为了处理多线程场景而设计的。
答案 2 :(得分:1)
虽然您不应该这样做的原因很多(请参阅http://support.microsoft.com/kb/257757了解相关信息),但您可能会遇到运行代码的问题。
您的网络服务器运行的标识是什么?当您以交互方式运行时(即使用visual studio等进行调试),您将以当前登录的用户身份运行,而在您的服务器上将以您的Web服务器正在运行的应用程序池(例如ApplicationPoolIdentity)运行
答案 3 :(得分:0)
在服务器端运行Word Interop主要是正确设置应用程序池使用的用户帐户权限的问题(例如webuser)。
应该在设置方面做到这一点。话虽这么说,服务器端的单词互操作仍然是后方的痛苦。我们现在已经在生产服务器上运行了2年,但它没有问题。即使我在测试服务器上运行了所有负载测试,我仍然不相信它真的没有内存泄漏。我们只使用它,因为我们需要docx到pdf转换,我们测试的所有库都不能正常工作,性能很差或者使用单词互操作。它作为一个独立的Windows服务运行,有很多小时进入崩溃恢复等。我从不用它来编辑文档。这就是OpenXML SDK的用途。
顺便说一句:如果你的代码最终没有被最终的阻塞所困扰,你肯定会在内存泄漏中建立起来。此外,您需要在您正在使用的文档,应用程序的文档属性和应用程序本身上调用Marshal.FinalReleaseComObject
。