ASP.NET代码仅适用于本地计算机

时间:2011-01-16 22:53:26

标签: c# asp.net permissions ms-word access-denied

我在设置的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:检索COM类工厂   对于CLSID为{000209FF-0000-0000-C000-000000000046}的组件失败   由于以下错误:80070005访问被拒绝。 (例外   HRESULT:0x80070005(E_ACCESSDENIED))。在   MicrosoftWordOperations.GetContents()in   [path] \ MicrosoftWordOperations.cs:第26行   [path] \ WordCounter.aspx.cs中的Content_WordCounter.CountWords():第69行

修改

MSWord安装在服务器上。

修改

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

3 个答案:

答案 0 :(得分: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应用程序(例如,使用web.config中的<identity ...>标记)。让我再次引用上面链接的知识库文章:

  

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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