ApplicationClass Documents.Open在64位系统上为ASP.NET站点返回null

时间:2011-10-07 16:02:45

标签: asp.net .net ms-word office-interop

我在从ASP.NET站点打开word文档时遇到问题。该解决方案在Windows 2003 Server上运行良好,但在Windows 2008服务器x64和Windows 7 x64上无效。

为了简化解决方案,我创建了一个ASP.NET MVC 3站点并尝试从那里打开word文档。

我拥有的环境:Windows 7 x64和MS Office 2010 x64

打开文档的代码如下:

    public ActionResult WordTest()
    {
        var fullFileName = @"C:\inetpub\wwwroot\fpub\TestDocument.docx";
        var impersonation = new ImpersonationManager();
        impersonation.Impersonate();
        try
        {
            var application = new Application();

            try
            {
                Type documentsType = application.Documents.GetType();
                var document =(_Document)documentsType.InvokeMember("Open", BindingFlags.InvokeMethod, null, application.Documents,
                                               new object[] {fullFileName});

                try
                {
                    return View(new ModelData {Result = document == null ? "Bad" : "OK"});
                }
                finally
                {
                    if (document != null)
                    {
                        document.Close(false);
                        Marshal.ReleaseComObject(document);
                    }
                }
            }
            finally
            {
                application.Quit(false);
                Marshal.ReleaseComObject(application);
            }
        }
        finally
        {
            impersonation.CloseImpersonation();
        }
  }

首先,我模仿使用受信任的域用户帐户进行单词交互(ImpersonationManager是一个自定义组件)。该用户有权打开\ save \ close Word Application。在我的测试中,这是我自己的帐户:)

然后我创建Word应用程序实例。 WINWORD进程在模拟帐户下启动。

但是在调用“Open”方法之后,它总是返回null。没有例外,事件查看器中没有信息。

此外,Word进程在此之后将CPU加载100%(1核CPU)。

如果我运行相同的代码(没有模拟)作为控制台应用程序,它可以正常工作。

我想知道这里可能出现什么问题?

更新如果Visual Studio开发服务器用作网站的主机,则可以正常工作

2 个答案:

答案 0 :(得分:3)

MS不支持在服务器场景中使用Office互操作(如ASP.NET,Windows服务等) - 请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

此外,自Windows Vista以来已经发生了一些与安全相关的更改,基本上很难在Windows服务中执行任何“类似桌面”的操作(IIS / ASP.NET只是Windows服务在这方面的特例) )。

有几个库(免费和商业)来处理Office文件(没有Office Interop)...以帮助您进一步描述您的目标。

答案 1 :(得分:1)

无论接受的答案是否有人需要支持遗留代码。可以在此处找到问题的解决方案:http://social.msdn.microsoft.com/Forums/en-US/0f5448a7-72ed-4f16-8b87-922b71892e07/word-2007-documentsopen-returns-null-in-aspnet