0

設定したASP.NETWebサイトで問題が発生し、デバッグが非常に困難です。

背景情報:

私のWebサイトには、ユーザーが1つまたは複数のMicrosoftWordドキュメントをアップロードできるページがあります。次に、ユーザーはボタンを押すことができ、コードはドキュメントを開き、単語を数え、テーブル内の単語数を返すことになっています。

これは、デバッガーを実行しているVisual Studioで完全に正常に機能しますが、別のコンピューターからWeb経由で実行しようとすると、エラーが発生します。

ここにいくつかのコードがあります。できるだけ単純化してみました。

// List of int's to hold the number of words in each document
List<int> words = new List<int>();

// Loop through the files that the user selected
// (The files have already been uploaded, and now their path is in "lstFileBox")
for (int i = 0; i < this.lstFileBox.Items.Count; i++)
{
    try
    {
         String file = this.lstFileBox.Items[i].Text;
         // MicrosoftWordOperations is a custom class
         MicrosoftWordOperations wordOps = new MicrosoftWordOperations(file);
         String contents = wordOps.GetContents();
         int numWords = wordOps.CountWords(contents);

          // Add number of words to my list
          words.Add(numWords);

          // Delete the uploaded file, which was stored in a temporary location
          if (System.IO.File.Exists(file))
               System.IO.File.Delete(file);

          }
          catch (Exception e)
          {

          }
      }

      // ...
      // Then add number of words to a table
      // ...

そして、MicrosoftWordOperationsコードはかなり基本的です:

public class MicrosoftWordOperations
{
    private String _file;

    public MicrosoftWordOperations(String file)
    {
        this._file = file;
    }

    public String GetContents()
    {
        object fileName = (object)this._file;
        object missing = System.Reflection.Missing.Value;

        Word.Application wordObject = new Word.Application();
        Word.Document wordDocument = wordObject.Documents.Open(
            ref fileName, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing,
            ref missing, ref missing, ref missing, ref missing);
        Word.Document activeDocument = wordObject.ActiveDocument;
        String fileContents = activeDocument.Content.Text;
        wordDocument.Close(ref missing, ref missing, ref missing);

        return fileContents;
    }

    public int CountWords(String text)
    {
        MatchCollection collection = Regex.Matches(text, @"[\S]+");
        return collection.Count;
    }
}

編集:

私はいくつかの基本的なデバッグを行うことができました、そしてこれが最初のコードブロックで捕らえられる例外です:

System.UnauthorizedAccessException:CLSID {000209FF-0000-0000-C000-000000000046}のコンポーネントのCOMクラスファクトリの取得が、次のエラーのために失敗しました:80070005アクセスが拒否されました。(HRESULTからの例外:0x80070005(E_ACCESSDENIED))。[path] \ MicrosoftWordOperations.cs:line 26のMicrosoftWordOperations.GetContents()で[path] \ WordCounter.aspx.cs:line69のContent_WordCounter.CountWords()で

編集:

MSWordがサーバーにインストールされています。

編集:

26行目:Word.Application wordObject = new Word.Application();
69行目:String contents = wordOps.GetContents();

4

3 に答える 3

4

Microsoft MSKB 257757を引用するには:

Officeは不安定な動作を示す可能性があるため、Microsoftは現在、無人の非対話型クライアントアプリケーションまたはコンポーネント(ASP、ASP.NET、DCOM、およびNTサービスを含む)からのMicrosoftOfficeアプリケーションの自動化を推奨していません。または、Officeがこの環境で実行されている場合はデッドロック。

だから、あなたはそれをすべきではありません。そうは言っても、問題を解決してみましょう。WordはWebサーバーにインストールされていますか?いいえの場合:インストールする必要があります。MicrosoftWordOperations.csはいの場合、 26行目(エラーメッセージに記載されている行)の行を教えてください。

編集:26行目はWord.Applicationの作成であるため、Webアプリケーションを実行しているユーザーアカウントには、Wordを起動するために必要な権限がない可能性があります。この仮定を確認するために、サーバー上の「通常の」ユーザーのアカウントでWebアプリケーションを実行することをお勧めします(たとえば、<identity ...>web.configのタグを使用)。上記のリンク先のKB記事からもう一度引用させてください。

ユーザーID:自動化によってアプリケーションが起動された場合でも、Officeアプリケーションは、アプリケーションの実行時にユーザーIDを想定します。アプリケーションは、アプリケーションを起動したユーザーのユーザーレジストリハイブの設定に基づいて、ツールバー、メニュー、オプション、プリンター、および一部のアドインを初期化しようとします。多くのサービスは、ユーザープロファイルを持たないアカウント(SYSTEMアカウントやIWAM_ [servername]アカウントなど)で実行されます。そのため、起動時にOfficeが正しく初期化されない場合があります。この状況では、OfficeはCreateObject関数またはCoCreateInstance関数でエラーを返します。Officeアプリケーションを起動できたとしても、ユーザープロファイルが存在しないと、他の機能が正しく動作しない場合があります。

したがって、Webアプリケーションは、ユーザープロファイルを持つWindowsアカウントで実行する必要があります。

于 2011-01-16T22:59:54.347 に答える
1

他の人が言っているように、サーバー上でWordを自動化することは悪い考えです。代替ソリューションを検討しましたか?

openxml形式(.docx)を排他的に使用できる場合は、OpenXmlSDK方が適しています。古い.doc形式でドキュメントを生成する必要がある場合は、Asposeなどのサードパーティコンポーネントを検討することをお勧めしますが、これは明らかに無料のソリューションではありません。

于 2011-01-16T23:19:39.163 に答える
0

そのリモートサービスにMicrosoftWordがインストールされていない限り、そのコードに依存することはできません。このコードは、サーバー側のコードが実行されているマシンでCOM自動化を使用しています。

于 2011-01-16T22:56:37.833 に答える