excel interop无法在多次调用后启动服务器exception

我有一个asp.net MVC Web应用程序谁使用Excel互操作在Excel中打开CSV文件保存为XLSX的文件,并从该文件加载字节。 这些字节然后作为下载传递。

到目前为止,一切都按预期工作 但在6下载后,我得到以下例外。 不幸的是,这是在德国,因为服务器是在德国安装。 但是exception消息类似于“80080005启动服务器失败”。

Die COM-Klassenfactory für die Komponente mit CLSID {00024500-0000-0000-C000-000000000046} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80080005 Starten des Servers fehlgeschlagen (Ausnahme von HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde. Ausnahmedetails: System.Runtime.InteropServices.COMException: Die COM-Klassenfactory für die Komponente mit CLSID {00024500-0000-0000-C000-000000000046} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80080005 Starten des Servers fehlgeschlagen (Ausnahme von HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). 

当我重新启动网站时,它将在下一个5-7次下载中再次运行。

这里是我的Excel的代码:

 private byte[] WriteExcel(SelectionResult result) { var csvPath = Path.Combine(Settings.Default.FileGenerationPath, DateTime.Now.ToString("yyMMMddhhmmss") + "_" +new Random().Next(1000, 9999)+".csv"); var excelPath = Path.Combine(Settings.Default.FileGenerationPath, DateTime.Now.ToString("yyMMMddhhmmss") + "_" + new Random().Next(1000, 9999)+".xlsx"); var excelApp = new Application(); File.WriteAllBytes(csvPath, WriteCsv(result, true)); var excelWorkbooks = excelApp.Workbooks; excelWorkbooks.Open(csvPath, Delimiter: ","); var workbook = excelApp.ActiveWorkbook; workbook.SaveAs(excelPath, XlFileFormat.xlOpenXMLWorkbook); excelWorkbooks.Close(); excelApp.Quit(); var bytes = File.ReadAllBytes(excelPath); File.Delete(csvPath); File.Delete(excelPath); return bytes; } 

我错过了什么?

根据微软支持 ,那种错误

您可能会收到一个“错误代码80080005 – 服务器执行失败。” 当您启动许多COM +应用程序错误信息

当您使用太多的COM应用程序时会出现。 而你有一个非常不处理非托pipe资源。 每次使用using语句都在使用input输出操作。

更新号你没有。 closuresExcel不会在应用程序运行时释放COM对象。

你需要:

  //include marshal using System.Runtime.InteropServices; //release objects Marshal.ReleaseComObject(excelApp); Marshal.ReleaseComObject(excelWorkbooks); Marshal.ReleaseComObject(workbook);