C# ASP.NET代码仅在本地计算机上工作

C# ASP.NET代码仅在本地计算机上工作,c#,asp.net,permissions,ms-word,access-denied,C#,Asp.net,Permissions,Ms Word,Access Denied,我在安装ASP.NET网站时遇到一些问题,调试起来非常困难 背景资料: 我的网站上有一个页面,允许用户上载一个或多个Microsoft Word文档。然后,用户可以按一个按钮,代码应该打开文档,计算字数,然后返回表中的字数 当我在visualstudio中运行调试器时,这工作得非常好,但是当我试图从另一台计算机通过web执行调试器时,我会遇到一个错误 下面是一些代码。我尽量简化它 // List of int's to hold the number of words in each docum

我在安装ASP.NET网站时遇到一些问题,调试起来非常困难

背景资料:

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

当我在visualstudio中运行调试器时,这工作得非常好,但是当我试图从另一台计算机通过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
      // ...
编辑:

我能够进行一些基本调试,下面是在第一个代码块中捕获的异常:

System.UnauthorizedAccessException:检索COM类工厂 对于CLSID为{000209FF-0000-0000-C000-0000000000 46}的组件失败 由于以下错误:80070005访问被拒绝。(不适用于 HRESULT:0x80070005(E_ACCESSDENIED))。在 中的MicrosoftWordOperations.GetContents() [路径]\MicrosoftWordOperations.cs:第26行 [path]\WordCounter.aspx.cs中的Content\u WordCounter.CountWords():第69行

编辑:

MSWord已安装在服务器上

编辑:

第26行:
Word.Application wordObject=new Word.Application()

第69行:
String contents=wordOps.GetContents()

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

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

引用Microsoft的话:

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

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

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

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

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

引用Microsoft的话:

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

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

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

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


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

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


如果可以专门使用openxml格式(.docx),则是更好的选择。如果您必须以旧的.doc格式生成文档,我建议您考虑使用第三方组件,如Aspose,尽管这显然不是免费的解决方案

正如其他人所说,这是一个坏消息
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;
    }
}