У нас есть веб-приложение, которое создает таблицы Excel и запускает макросы на стороне сервера. Затем он отправляет их другим людям по электронной почте. Это часть старого стиля отчетности, который мы переходим, но все еще поддерживаем в нашем новом приложении, которое мы предоставили в качестве веб-сайта в IIS.Получение System.Runtime.InteropServices.COMException Ошибка в стороне сервера Создано Excel
Я знаю, что это плохая практика для автоматизации Office, поскольку я видел информацию от Microsoft, что это не поддерживается. Это также указывается в ответе здесь opening excel error: System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID
В любом случае, чтобы сократить историю, отчеты excel генерируются в пакетном сценарии, который может генерировать от 3 до 300 отчетов, отправляемых различным людям. Генерация отчетов работает отлично, пока не достигнет около 15 до 20 пункта, то это игра в кости, оно дает мне ошибку ниже
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)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at Ci.Infrastructure.Reporting.ReportProviderExcel.RunReport()
Что может быть не так? Первые отчеты оказались успешными, и я знаю, что это не шаблоны excel, потому что, когда я снова заново его запускаю, все неудавшиеся будут успешно продолжены, а когда будет создан отчет от 15 до 20, он снова выдаст ошибку.
Обновление: Мы знаем, что задавали проблемы, но мне нужно решение, чтобы исправить проблему. Помните, что это для устаревших вещей, которые мы прекратим поддерживать в будущем, но в переходный период нам это нужно.
Мы пробовали сериализовать все еще не работает. Мы попытались скрыть поток, который генерирует отчет Excel, когда он попадает в COM Exception, он работает, но это не изящный результат. Любое хорошее решение для решения этой проблемы получит награду.
Другой Update:
решаемый делать это на окончательно блокировать
finally
{
if (dataWorksheet != null)
{
Marshal.ReleaseComObject(dataWorksheet);
}
if (worksheets != null)
{
Marshal.ReleaseComObject(worksheets);
}
if (workbook != null)
{
workbook.Close(false);
Marshal.ReleaseComObject(workbook);
}
if (workbooks != null)
{
workbooks.Close();
Marshal.ReleaseComObject(workbooks);
}
if (excel != null)
{
excel.Quit();
Marshal.ReleaseComObject(excel);
}
}
Как и то, что сказал MarkWalls близко каждому из экземпляров первенствовать в качестве единицы работы, который полностью очищает EXCEL перед тем, как он будет использован снова.
Это, как правило, причина, почему это не поддерживается. Это «почти» работает.Ошибка означает, что между процессом и процессом Excel.exe существует проблема связи. Вероятно, это проблема синхронизации, состояние гонки и т. Д. Одна вещь, которую вы можете попробовать, - это сериализовать все вызовы в Excel, чтобы не иметь более одного ожидающего запроса/вызова COM в Excel на том же компьютере. –
Две вещи: можете ли вы переписать код, в котором вы создаете и удаляете электронные таблицы, вместо повторного запуска приложения? И если это слишком высокий уровень усилий, попробуйте установить интервал между экземплярами, чтобы дать время для освобождения ресурсов. – RandomUs1r