2011-03-24 55 views
3

我在使用Microsoft Word從ASP.NET MVC打開文檔時遇到問題。Documents.Add在ASP.NET(VB.NET)上失敗

這在我的開發人員機器上完美工作,但在部署到IIS時無法正常工作。

Dim word = New Microsoft.Office.Interop.Word.Application 

'This line is failing to return a document object 
Dim letter = word.Documents.Add(letter_doc_path) 

'This line then fails due to [letter] being null 
letter.MailMerge.OpenDataSource(csvPath) 

我在「組件服務」(DCOMCNFG)添加權限網絡服務用戶,允許在首位Word對象的創建,但我完全被卡住爲如何處理這個事情。

我也試圖抑制字對話框下面的行,以防萬一

word.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone 

的問題不是由沒有錯誤(除了空對象引用顯然)幫助 - 也許有辦法查詢Word的特定錯誤消息?

+0

是否需要權限才能創建臨時文件? – StingyJack 2011-03-24 14:58:19

+0

@SingyJack - 我也這麼認爲,它可能是相關的,但在第二行之後,它實際上創建了〜docname.doc臨時文件,就好像文檔已打開一樣(並且文檔過程的內存隨着文檔打開而增加) – wheelibin 2011-03-24 15:02:41

回答

4

Word需要的normal.dot打開任何文檔時的模板文件,問題發生的原因是IIS用戶沒有任何地方創建normal.dot,所以它在後臺失敗。

這是通過爲新創建的詞實例(創建後立即)設置UserTemplate路徑來解決的。

路徑必須是IIS用戶可寫的(NETWORK SERVICE在我的情況下)。

word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder 

所以只是爲了完整性,這裏是原來的例子有包括獲獎線:

Dim word = New Microsoft.Office.Interop.Word.Application 

'this line fixed it 
word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder 

Dim letter = word.Documents.Add(letter_doc_path) 
+0

很高興聽到你的工作和記錄。 +1。您可以繼續,並使用旁邊的空白複選標記接受您自己的答案。 – 2011-03-27 19:33:13

0
+0

嗨,我使用try/catch塊「捕獲錯誤」,由於Documents.Add失敗,沒有錯誤,第三行拋出「Object variable或block variable not set」。恐怕這些鏈接都沒有提供任何幫助這個問題 - 謝謝 – wheelibin 2011-03-24 10:12:11

0

我有同樣的問題,那wheelibin建議的設置是不夠的創建使用文件NETWORK SERVICE帳戶。

我最終什麼事做的是:

  • 創建用戶帳戶此 進程下運行。

  • 登錄爲用戶和運行Word(這 確實在Word中各種設置任務,以便 作爲 服務運行時,應用程序不會嘗試把 了模態對話框)。

  • 創建一個新的應用程序池並將該池設置爲 作爲用戶帳戶運行。

如果你正在使用Windows身份驗證 ,你的服務器是 的Windows 2003(或2000年,大概),然後 適用this issue,你 需要更改的 服務器的SPN,這將破壞Windows 對在其他用戶 帳戶下運行的任何應用程序 進行身份驗證,或者您必須將 身份驗證提供程序切換爲NTLM 而不是Kerberos。

IIS 7可以使用內核模式身份驗證來避免此問題。