2010-10-05 52 views
3

我有一個Web應用程序,它需要一些客戶端信息併爲每個客戶端生成一封信。在我的測試環境中,一切正常,但在生產服務器上出現錯誤,說文件已損壞。我可以在服務器上打開.dotx文件,但無法通過代碼打開。請幫忙。這裏是我的代碼:Com例外:Word無法閱讀此文檔。它可能會損壞

Object oMissing = System.Reflection.Missing.Value; 

      Object oTrue = true; 
      Object oFalse = false; 

      Word.Application oWord = new Word.Application(); 
      Word.Document oWordDoc = new Word.Document(); 


      oWord.Visible = false; 

      Object oTemplatePath = Request.PhysicalApplicationPath + "letters\\" + letter.letter_data; //samplehollisletter.dotx"; 

      oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing); 

      foreach (Word.Field myMergeField in oWordDoc.Fields) 
      { 

       iTotalFields++; 
       Word.Range rngFieldCode = myMergeField.Code; 
       String fieldText = rngFieldCode.Text; 

       if (fieldText.StartsWith(" MERGEFIELD")) 
       { 

        Int32 endMerge = fieldText.IndexOf("\\"); 
        Int32 fieldNameLength = fieldText.Length - endMerge; 
        String fieldName = fieldText.Substring(11, endMerge - 11); 

        fieldName = fieldName.Trim(); 

        if (fieldName == "letter_title") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.letter_title); 
        } 
        if (fieldName == "account_id") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.account_id); 
        } 

        if (fieldName == "address") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.PEOPLE.home_address + "\r\n" + acct.PEOPLE.home_city + ", " + acct.PEOPLE.home_state + " " + acct.PEOPLE.home_zip); 
        } 

        if (fieldName == "greeting_title") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText(acct.greeting_title); 
        } 

        if (fieldName == "service_name") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText((acct.SERVICEs.FirstOrDefault()).service_name); 
        } 

        if (fieldName == "service_date") 
        { 
         myMergeField.Select(); 
         oWord.Selection.TypeText((acct.SERVICEs.FirstOrDefault()).service_date.ToString()); 
        } 


       } 
      } 
      oWordDoc.PrintOut(); 
      oWordDoc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges); 
      Thread.Sleep(2000); 
      oWord.Quit(); 

的錯誤是:

Server Error in '/Tracker2' Application. 

Word無法讀取此文檔。它可能是腐敗的。 請嘗試下列辦法中的一個或多個: *打開並修復文件。 *使用文本恢復轉換器打開文件。 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:System.Runtime.InteropServices.COMException:Word無法讀取此文檔。它可能是腐敗的。 請嘗試下列辦法中的一個或多個: *打開並修復文件。 *使用文本恢復轉換器打開文件。

源錯誤:

在當前web請求的執行過程中生成未處理的異常。關於異常的來源和位置的信息可以使用下面的異常堆棧跟蹤來標識。

堆棧跟蹤:

[收到COMException(0x800a141f):Word無法讀取此文檔。它可能是腐敗的。 請嘗試下列辦法中的一個或多個: *打開並修復文件。 *打開與文本恢復轉換的文件。] Microsoft.Office.Interop.Word.Documents.Add(對象&模板,對象& NewTemplate,對象& DocumentType,對象&可見)+0 Tracker.RunLetter2.Button1_Click(對象發件人,EventArgs e)在C:\ Users \ Ethan \ Documents \ Visual Studio 2010 \ Projects \ EstateTracker \ Tracker \ RunLetter2.aspx.cs中:52 System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)+ 154 System.Web.UI.Page.ProcessRequestMain(布爾includeStagesBeforeAsyncPoint,布爾includeStagesAfterAsyncPoint)+3691

+0

不要在服務中自動化Word。 – SLaks 2010-10-05 16:50:44

+0

其不在服務中。 – ecspot 2010-10-05 18:27:43

回答

2

我發現問題源於permissio ns使用BasicHTTPBinding端點進行WCF調用。當使用這種類型的終端進行呼叫時,該服務假定使用沒有桌面的IIS帳戶來打開單詞。這是帳戶自動化單詞的要求。即使你有一個服務,啓動一個windows應用程序,啓動單詞,整套事件將被授予原始WCF調用的特權,並將導致此錯誤。

我的解決方案雖然不是很好,但也不是我真正想要的,暫時工作。我在數據庫中創建了一個隊列表。然後我有Web應用程序插入任務完成請求。那麼在服務器上,我有一個獨立的應用程序,每隔60秒就會檢查隊列中的請求並處理請求。它不是像我所說的最好的方法,它確實有效。

7

我知道是時候該項目已經打開,但因爲我沒有在任何地方找到答案,所以需要解決方案。

1 - 在IIS中,應用程序所使用的應用程序池,身份屬性更改爲LocalSystem

2 - 創建一個服務器上的以下目錄中稱爲桌面文件夾: C:\ WINDOWS \ SYSTEM32 \配置\ systemprofile 和 C:\ WINDOWS \ Syswow64資料\ CONFIG \ systemprofile

之後,充分權限這兩個文件夾的用戶羣IIS:IIS_IUSRS

這將導致該用戶有一個「桌面「工作,噸特此實現IIS Word使用庫。

我粗略地幫助別人。

+0

感謝它解決了我的問題,但是當我將兩個桌面文件夾都授予完全權限時,有一個關於安全性的警告。它以後會有什麼問題嗎? – Willy 2015-08-05 03:27:25