0

我在设置的 ASP.NET 网站上遇到了一些问题,而且很难调试。

背景资料:

我的网站上有一个页面允许用户上传一个或多个 Microsoft Word 文档。然后用户可以按下一个按钮,代码应该打开文档,计算单词,然后返回表格中的单词数。

当我在 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:line 69 中的 Content_WordCounter.CountWords()

编辑:

MSWord 安装在服务器上。

编辑:

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

4

3 回答 3

4

引用 Microsoft MSKB 257757

Microsoft 目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定的行为和/或在此环境中运行 Office 时出现死锁。

所以,你不应该这样做。也就是说,让我们尝试解决您的问题。Web 服务器上是否安装了 Word?如果否:您需要安装它。如果是,请告诉我们哪一行MicrosoftWordOperations.cs是第 26 行(错误消息中提到的那一行)。

编辑:由于第 26 行是 Word.Application 的创建,运行您的 Web 应用程序的用户帐户可能没有启动 Word 的必要权限。为了验证这个假设,我建议您在服务器上的“普通”用户帐户下运行 Web 应用程序(例如,使用<identity ...>web.config 中的标记)。让我再次引用上面链接的知识库文章:

用户身份:Office 应用程序在应用程序运行时假定用户身份,即使自动化启动应用程序时也是如此。应用程序尝试根据启动应用程序的用户的用户注册表配置单元中的设置来初始化工具栏、菜单、选项、打印机和一些加载项。许多服务在没有用户配置文件的帐户下运行(例如 SYSTEM 帐户或 IWAM_[servername] 帐户)。因此,Office 可能无法在启动时正确初始化。在这种情况下,Office 在 CreateObject 函数或 CoCreateInstance 函数上返回错误。即使可以启动 Office 应用程序,如果不存在用户配置文件,其他功能也可能无法正常工作。

因此,您的 Web 应用程序需要在具有用户配置文件的 Windows 帐户下运行。

于 2011-01-16T22:59:54.347 回答
1

正如其他人所说,在服务器上自动化 Word 是个坏主意。您是否考虑过替代解决方案?

如果您可以独占使用 openxml 格式 (.docx),则OpenXml SDK是更好的选择。如果您必须以较旧的 .doc 格式生成文档,我建议您查看像 Aspose 这样的第 3 方组件,尽管这显然不是免费的解决方案。

于 2011-01-16T23:19:39.163 回答
0

除非该远程服务安装了 Microsoft Word,否则您不能依赖该代码。该代码在运行服务器端代码的机器上使用 COM 自动化。

于 2011-01-16T22:56:37.833 回答