ApplicationClass Documents.Open возвращает значение null для сайта ASP.NET в 64-битной системе - PullRequest
3 голосов
/ 07 октября 2011

У меня проблема с открытием документа Word с сайта ASP.NET. Решение отлично работает на Windows 2003 Server, но не работает на Windows 2008 Server x64 и Windows 7 x64.

Чтобы упростить решение, я создал сайт ASP.NET MVC 3 и попытался открыть оттуда текстовый документ.

Среда у меня: 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 - это пользовательский компонент). У этого пользователя есть права на открытие \ сохранение \ закрытие приложения Word. В моих тестах это мой собственный аккаунт:)

Затем я создаю экземпляр приложения Word. WINWORD процесс запускается под олицетворенной учетной записью.

Но после вызова метода «Open» он всегда возвращает ноль. Нет исключений, нет информации в программе просмотра событий.

Более того, после этого процесс Word загружает ЦП на 100% (1 ядро ​​ЦП).

Если я запускаю тот же код (без олицетворения), что и консольное приложение, оно работает нормально.

Интересно, в чем здесь проблема?

Обновление Работает нормально, если в качестве хоста для сайта используется сервер разработки Visual Studio

Ответы [ 2 ]

3 голосов
/ 07 октября 2011

Использование взаимодействия Office в сценарии сервера (например, ASP.NET, Windows Service и т. Д.) Не поддерживается MS - см. http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

Кроме того, в Windows Vista было несколько изменений, связанных с безопасностью, которые в основном затрудняют выполнение чего-либо «похожего на рабочий стол» в службе Windows (IIS / ASP.NET является лишь частным случаем службы Windows в этом отношении ).

Существует несколько библиотек (бесплатных и коммерческих) для работы с файлами Office (без Office Interop) ... чтобы помочь вам в дальнейшем описать вашу цель.

1 голос
/ 30 августа 2013

Независимо от принятого ответа, некоторые люди должны поддерживать устаревший код. Решение проблемы можно найти здесь: http://social.msdn.microsoft.com/Forums/en-US/0f5448a7-72ed-4f16-8b87-922b71892e07/word-2007-documentsopen-returns-null-in-aspnet

...