Ошибка выполнения сервера (исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE))
Я пытаюсь преобразовать файл.xls в файл.xlsx на стороне сервера, используя Microsoft.Office.Interop.Excel.Workbook
Класс следующим образом:
workBook.SaveAs("FILENAME_HERE", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
и я получаю следующую ошибку:
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). : System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj)
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at CALLING_METHOD_IN_MY_LIBRARY_HERE...
Проблема в том, что эта ошибка возникает только на промежуточном сервере; на моей локальной машине все работает нормально.
Вещи, которые я пробовал на промежуточном сервере:
- ** 1) Запустите dcomcnfg open Службы компонентов
2) Разверните Службы компонентов "->" Компьютер "->" Мой компьютер "->" Конфигурация DCOM "
3) Найдите "Приложение Microsoft Excel".
4) Право, чтобы открыть диалоговое окно Свойства
5) Нажмите на вкладку "Безопасность",
6) "Разрешения на запуск и активацию, настройка разрешений, добавленные разрешения - идентификация запускается под пользователем Adminstrator (этот пользователь), интерактивным пользователем и запускающими пользователями".
7). Разрешения на запуск и активацию + Разрешения на доступ + Разрешения на настройку => добавлены IIS_IUSRS + Сетевая служба с полным контролем **
2.Изменил сборку проекта, которая преобразует файл.xls из "Любого процессора" в "x86" на моем локальном компьютере, и опубликовал эту библиотеку на сервере.
Кто-то разобрался, как решить эту проблему? Я борюсь за решение этой проблемы в течение 2 дней.
11 ответов
Использование DCOMCNFG.exe. Откройте его и выберите: Службы компонентов -> Компьютеры -> Мой компьютер -> Конфигурация DCOM -> Приложение Microsoft Excel.
Откройте свойства, выберите вкладку "Удостоверение" и выберите интерактивного пользователя.
Я нашел решение в другом месте.
Выполнение следующих действий решило мою проблему:
Использование DCOMCNFG.exe. Откройте его и выберите: Службы компонентов -> Компьютеры -> Мой компьютер -> Конфигурация DCOM -> Приложение Microsoft Excel. Откройте свойства, выберите вкладку Identity и выберите интерактивного пользователя.
НО- проблема возвращалась каждые несколько минут!
После нескольких часов попыток выяснить причину, я заметил, что на моем сервере былисотни открытых процессов WINWORD.EXE. Это вызвало проблемы с памятью, которые привели к exception from hresult 0x80080005
ошибка.
Ну, довольно глупо, я забыл написать код, чтобы закрыть приложение взаимодействия. Как только я исправил это, ошибка исчезла.
doc.Close(false);
Marshal.ReleaseComObject(doc);
word.Quit();
Marshal.ReleaseComObject(word);
Я нашел эту статью, в которой более подробно говорится об этой проблеме. Если это поможет, ошибка "80080005 Выполнение сервера не удалась (Исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)))" может возникнуть по следующим причинам:
- Машина имеет высокую загрузку ЦП, и запуск процесса занимает много времени и не может выполнить CoRegisterClassObjects() менее чем за 120 секунд.
- COM-сервер не регистрируется для правильных идентификаторов классов.
- COM-сервер в настоящее время останавливается, и существует условие состязания между CoCreateInstance и частью остановки COM-сервера.
- Существует проблема безопасности в способе запуска COM-сервера (кажется, что на этой странице предлагаются неправильно написанные пароли или отсутствует привилегия "Войти как пакетное задание" для COM-серверов "Запуск от имени"), но в любом случае я бы предложил еще раз проверить это информация для вашей конкретной конфигурации)
Я исправил эту проблему с помощью этого решения: щелкните правой кнопкой мыши Службы компонентов / Компьютеры / Конфигурация DCOM /Microsoft Word97 - 2003 Свойства документа / Вкладка "Общие"
установить уровень аутентификации: нет
TL; DR; исправление для меня - отключить автовосстановление из файла -> Параметры -> Сохранить, а затем удалить все автоматически восстановленные файлы. Похоже, что основная причина заключается в объеме файлов автовосстановления.
Предпосылки Я чередую много циклов открытия / закрытия / вычисления. Периодически приложение C# не может открыть книгу из-за ошибки ниже.
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
Приложение неоднократно выдает эту ошибку и застревает в этом состоянии до тех пор, пока автоматически восстановленные файлы не будут удалены из Excel.
Далее следует другой симптом; когда я пытаюсь открыть приложение Excel (как будто для создания новой книги, а не для открытия существующей), требуется много времени, чтобы вращать циклы процессора. Со временем он открывается, и на панели «Восстановленные файлы» слева перечислено множество файлов.
я
Close
панели с помощью кнопки, все файлы затем удаляются. Повторное открытие Excel после этой процедуры почти мгновенно. С этого момента приложение снова работает нормально.
Пуск -> Выполнить (Windows+R)
Введите: dcomcnfg -32 (нажмите Enter), это должно открыть службы компонентов .
Разверните Службы компонентов, Компьютеры, Мой компьютер, Конфигурация DCOM.
Прокрутите вниз до «Приложение Microsoft Excel»
Щелкните правой кнопкой мыши, выберите свойства, перейдите на вкладку «Безопасность».
Изменить права доступа
Нажмите Добавить
Введите <Computer_Name>/IIS_IUSRS (или перейдите в Locations, выберите имя компьютера — если используется домен, по умолчанию он будет искать домен и не найдет IIS_IUSRS)
Убедитесь, что флажок «Разрешить» установлен для «Локальный доступ».
Нажмите OK, еще раз нажмите OK (перезагрузка не требуется)
Центр обновления Windows будет сбрасывать это когда-либо один раз
У меня была аналогичная проблема с моим консольным приложением Visual Studio. Я попробовал вышеупомянутое решение, упомянутое «Владимиром Шияновым».
Кроме того, мое приложение было настроено на запуск только для 32-битных приложений. Когда я снял этот флажок, приложение заработало успешно.
Та же проблема была решена для меня "разрешением взаимодействия с рабочим столом" для сервиса. (в инструменте конфигурации tomcat6w на вкладке Вход в систему)
Вы никогда не захотите иметь Excel на стороне сервера!
И, пожалуйста, поверьте мне, если вам нужно манипулировать листами Excel, вы не хотите использовать ничего, кроме Excel. Не используйте какую-либо библиотеку, потому что рано или поздно вы столкнетесь с ошибками, которые не могут быть исправлены или не могут быть исправлены по нескольким причинам (одна из которых состоит в том, что Excel делает что-то "неправильно"). Вы используете Excel только на стороне клиента. Ваш клиент должен установить и поддерживать его. Если он есть, вы его используете, в противном случае вы говорите им, что функциональность Excel работает только с действующей установкой Excel на клиентском компьютере.
Используйте XML, DataSet или что-то еще для потоковой передачи информации Excel на сервер для ее хранения. Или манипулируйте этими данными с помощью кода на стороне сервера, но не с помощью Excel.
Взаимодействие с Excel всегда должно происходить на клиентском компьютере. Это просто так...
Я все это попробовал, ничего не помогло. Для меня это просто открытие Excel, которое заработало, а затем закрытие его. Просто открываю и закрываю. Я правда не понимаю, ПОЧЕМУ так получилось. Пробовал дважды, обе ошибки, обе решаются простым открытием Excel.
Попробуйте добавить метод Thread.Sleep, например Thread.Sleep(2000), на 2 секунды после двух методов workBook.open и workBook.Save. Если ваш файл Excel имеет много форматов, попробуйте продлить еще несколько секунд.