2011-07-20 10 views
1

サーバーで動作するC#ウィンドウサービスを作成しています(OFFICEでインストール済み) MS Word DOCをRTFファイルに変換し、リッチテキストボックス、およびDBへのRTF文字列とプレーンテキスト文字列を取得(ユーザー検索できるようにフルテキストインデックス作成のためのプレーンテキスト文字列を取得)C#Service Word "メモリが不足していますので、今すぐ文書を保存してください"

私はしかし、それはエラーが発生しました 、サービスで変換を実行し、次のコードを使用しました行 newApp.Documents.Open "メモリが不足していますので、今すぐドキュメントを保存してください"

私はチェックしました彼はサーバーのタスクマネージャーと私は、Winword.exeがメモリの多くを読み込んでいることを発見した(60〜70 Mbと言う)とそれは終了しません(まあ、それは..... ..... _ <

私は ' Windowsフォームで同じマシンで同じコードを実行しようとすると、エラーは発生しません。 サービスは管理者として既に実行されています。

private void doc2rtf(object Source, object Target) 
    { 
     //Creating the instance of Word Application 
     Word.Application newApp = new Word.Application(); 

     newApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable; 
     newApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone; 

     // specifying the Source & Target file names 

     // Use for the parameter whose type are not known or 
     // say Missing 

     object Unknown = Type.Missing; 
     object objReadOnly = true; 
     object objFalse = false; 
     try 
     { 
      // Source document open here 

      // Additional Parameters are not known so that are 
      // set as a missing type 
      lw.writeLog(LogWriter.logType.DEBUG, "before newApp.Documents.Open", Source.ToString()); 
      newApp.Documents.Open(ref Source, ref Unknown, 
       ref objReadOnly, ref Unknown, ref Unknown, 
       ref Unknown, ref Unknown, ref Unknown, 
       ref Unknown, ref Unknown, ref Unknown, 
       ref Unknown, ref Unknown, ref Unknown, ref Unknown); 
      lw.writeLog(LogWriter.logType.DEBUG, "after newApp.Documents.Open", Source.ToString()); 
      // Specifying the format in which you want the output file 

      object format = Word.WdSaveFormat.wdFormatRTF; 

      //check header footer exists. 
      lw.writeLog(LogWriter.logType.DEBUG, "before newApp.ActiveDocument.SaveAs", Target.ToString()); 
      //Changing the format of the document 
      newApp.ActiveDocument.SaveAs(ref Target, ref format, 
        ref Unknown, ref Unknown, ref Unknown, 
        ref Unknown, ref Unknown, ref Unknown, 
        ref Unknown, ref Unknown, ref Unknown, 
        ref Unknown, ref Unknown, ref Unknown, 
        ref Unknown, ref Unknown); 
      lw.writeLog(LogWriter.logType.DEBUG, "after newApp.ActiveDocument.SaveAs", Target.ToString()); 
     } 
     catch (Exception e) 
     { 
      lw.writeLog(LogWriter.logType.ERROR, e.Message, "doc2rtf"); 
     } 
     finally 
     { 
      lw.writeLog(LogWriter.logType.DEBUG, "before newApp.ActiveDocument.Close(", ""); 
      newApp.ActiveDocument.Close(ref objFalse, ref Unknown, ref Unknown); 
      // for closing the application 
      lw.writeLog(LogWriter.logType.DEBUG, "after newApp.ActiveDocument.Close(", ""); 

      lw.writeLog(LogWriter.logType.DEBUG, "before newApp.ActiveDocument.Quit(", ""); 
      newApp.Quit(ref objFalse, ref Unknown, ref Unknown); 
      lw.writeLog(LogWriter.logType.DEBUG, "after newApp.ActiveDocument.Quit(", ""); 
      newApp = null; 

      GC.Collect(); 
     } 
    } 
+3

Wordはサーバーコンテキストで実行されることを目的としていません(また、前回チェックした場合、その使用のためにライセンスされていません)。ワードドキュメントを処理できるサードパーティのアプリケーションがあります。 –

+0

少し興奮していますか?このサービスが複数のユーザーによって同時に使用されているかどうかはわかりません。マイクロソフトがお客様のクライアント製品ではなくオフィスWebサービスを使用することが望ましいと思われます。しかし、それは非常に良い問題を浮き彫りにしていた。 +1 – hoodaticus

答えて

1

Windows Server 2008(またはWindows 7でも可能)を使用している場合は、this questionへの私の回答を参照してください。それは助けるかもしれない。

+0

OH !!!あなたは私を救いました!!それは今働いている!!!! – AlphaAu

+0

+1の成功! – hoodaticus

1

このエラーメッセージは、それほど役に立たないものです。これは、アクセス許可の問題、Officeと互換性がないAVプログラム、IISでホストしているAVプログラム、または一括して処理している間にThread.Sleepを呼び出す必要があるため、Wordの非同期処理がキャッチできるようにすることですアップ。また、破損したドキュメントテンプレートを意味することもあります。可能性は、それらを解決するために必要なトラブルシューティングの手順と同じくらい無限のようです。

ただし、WinFormで正常に実行したときに何かが変更されていました。アクセス権の問題が発生します。サービスが実行されているアカウントが、開こうとしているファイルにアクセスできることを確認してください。

+0

これは既に管理者アカウントとして実行されています...別のものを見つけることはできません... = __ = – AlphaAu

関連する問題