2017-10-04 159 views
2

我試圖創建一個使用互操作庫的Excel文件,但下面是我得到的錯誤:使用互操作庫Web服務器端的Excel創建

Creating an instance of the COM component with CLSID {00024500-0000-0000- 
C000-000000000046} from the IClassFactory failed due to the following error: 8001010a 
The message filter indicated that the application is busy. 
(Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)). 

我看着很多資源,在那裏上了網,其廣泛地可分爲以下:

  1. 互操作庫是專門爲桌面應用程序構建,以及在服務器端網絡應用程序使用它們如WCF是highly not recommended
  2. 與交互式用戶或DefaultAppPool相關的權限問題。

等等等等。

那麼,這裏的警告,我不能改變服務器端的應用程序,一切工作在其他地方。幾天前,Office 2016從我的機器上被推到我的機器上,並且在我的本地機器上停止工作(出現以上錯誤)。現在我不能去改變一個遺留代碼,但看看我是否可以解決我的本地問題以進一步開發。

下面是我做什麼,請注意一切工作本機(當Office 2013在那裏)上:

  1. 拿到辦公室2016卸載,然後重新安裝Office 2013,同樣的問題,因此又恢復到辦公室2016.目前MS-Office 2016 32位已安裝。
  2. Microsoft Excel Application安全選項卡的各個部分驗證的權限已添加IIS AppPool \ DefaultAppPool用戶,IIS_IUSRS,具有完全控制權限的交互式用戶(不應該錯誤爲「訪問被拒絕」,權限已被錯誤?)
  3. 創建一個新的示例web應用程序,以快速調試,運行它的所有組合的CPU平臺,即x86,AnyCpu,x64 - 同樣的問題。
  4. 有趣的是,它工作如果我的示例應用程序指向IIS Express而不是本地IIS。
  5. 增加了最新的版本互操作程序集用(安裝,包裝的Microsoft.Office.Interop.Excel -Version 15.0.4795.1000) - 還是同樣的問題
  6. 新增的Microsoft Office 16.0對象庫(2.8)到項目 - 仍然相同問題

這是一個古老的問題及其可能更好地逃脫互操作,但我想知道什麼可能會錯誤的 - 所有的上述建議實施IMessageFilter或什麼不是錯誤的直接結果,但我不能更改服務器端代碼,下面的代碼應該像前幾天一樣工作:

Microsoft.Office.Interop.Excel.Application l_ExcelApp = 
new Microsoft.Office.Interop.Excel.Application(); 

但它沒有,所以改變了?可能出了什麼問題?

此外,如果它有幫助--dcomcnfg(/ 32)中列出的ApplicationID是:00020812-0000-0000-C000-000000000046},但錯誤有一個不同。

去哪裏看?我希望這個問題的答案可以引導失去的靈魂永遠關於這個問題。

+0

實際上,您確實很幸運,以前所有工作都沒有任何問題......作爲Microsoft支持頁面的鏈接,您已經聲明:Microsoft Interop在服務器端環境中不受Microsoft支持,因爲它可以導致許多不同類型的問題。所以你真正能做的唯一事情就是:擺脫Office Interop部分,並替換它(例如用'OpenXML'或類似的庫)。我不認爲試圖找出任何原因是值得的,因爲整個構造非常「脆弱」(並且可能會隨着即將到來的Office更新再次破裂)。 – bassfader

回答

0

終於我能解決我的問題。以下工作:

Web應用程序託管在IIS中創建Excel文檔。

事實證明,除了權限之外,應用程序體系結構也應該是相似的,即我的應用程序是64位(在64位操作系統上以Any CPU運行)也是非常重要的。每當遇到這樣的問題時,請確保以下(除了將權限設置爲正確的用戶之外):

  1. 確保兩個應用程序(您自己的和excel)的架構同步。知道你的excel是64位還是32位的一個快速方法是查看任務管理器正在運行的程序。如果excel被列爲EXECEL.EXE*32,那麼你的辦公室是32位。
  2. 當您安裝Excel的一個新版本,請確保您完全刪除以前的版本(而不僅僅是卸載,而且去除通過刪除任何註冊表項,即dcomconfig辦公室的條目可以在註冊表編輯器找到所涉及的Office應用程序的GUID ,特別擅長)。

  3. 我把它通過在2描述完全刪除Office 2016後安裝Office 2013,並在我的代碼相應的固定Microsoft.Office.Core參考工作。我被分配以下

  4. 權限: 應用程序標識 - 交互式用戶 和安全選項卡中,添加IIS應用程序池\默認應用用戶所有部分,並給予了充分的權限。
  5. 我的應用在IIS內部的ApplicationPoolIdentity中運行。

如果上述所做的一切仍然無法解決您的問題,那麼上帝與您同在,爲您邁向開放XML的旅程帶來更多權力。

0

我建議使用Open XML SDK在服務器端處理或生成開放式XML文檔,有關更多信息,請參閱Welcome to the Open XML SDK 2.5 for Office。或者只是使用爲服務器端執行而設計的任何第三方組件。

正如你已經注意到了,​​文章指出以下幾點:

微軟目前並不提倡,不支持,Microsoft Office應用程序自動化從任何無人蔘與的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT服務),因爲Office在此環境中運行時可能會出現不穩定的行爲和/或死鎖。

如果您正在構建一個在服務器端上下文中運行的解決方案,那麼您應該嘗試使用對於無人執行安全的組件。或者,您應該嘗試找到允許至少部分代碼運行客戶端的替代方案。如果您從服務器端解決方案使用Office應用程序,則該應用程序將缺少成功運行所需的許多必要功能。此外,您將面臨整體解決方案穩定性的風險。

+0

感謝您的回答,但正如我在我的問題中提到的那樣,我不得不使用我的工作。將來,我會嘗試擺脫互操作 –