ASP.NET Code работает только на локальной машине - PullRequest
0 голосов
/ 17 января 2011

У меня возникли некоторые проблемы с настроенным веб-сайтом ASP.NET, и его очень трудно отладить.

Справочная информация:

На моем веб-сайте есть страница, которая позволяетпользователь загружает один или несколько документов Microsoft Word.Затем пользователь может нажать кнопку, и код должен открыть документ (ы), посчитать слова, а затем вернуть количество слов в таблице.

Это прекрасно работает, когда я нахожусь вVisual Studio запускает отладчик, однако, когда я пытаюсь сделать это через Интернет с другого компьютера, я получаю сообщение об ошибке.

Вот некоторый код.Я попытался максимально упростить его.

// 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 () в [путь] \ MicrosoftWordOperations.cs: строка 26 в Content_WordCounter.CountWords () в [путь] \ WordCounter.aspx.cs: строка 69

Редактировать:

MSWord установлен на сервере.

Редактировать:

Строка 26: Word.Application wordObject = new Word.Application();
Строка 69: String contents = wordOps.GetContents();

Ответы [ 3 ]

4 голосов
/ 17 января 2011

Цитировать Microsoft MSKB 257757 :

Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office из любых необслуживаемых, неинтерактивных клиентских приложений или компонентов (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может работать нестабильно. поведение и / или взаимоблокировка при работе Office в этой среде.

Итак, вы не должны этого делать. Тем не менее, давайте попробуем исправить вашу проблему. Word установлен на веб-сервере? Если нет: вам нужно установить его. Если да, пожалуйста, сообщите нам, какая строка MicrosoftWordOperations.cs является строкой 26 (той, которая указана в сообщении об ошибке).

РЕДАКТИРОВАТЬ: Поскольку строка 26 является созданием Word.Application, учетная запись пользователя, на котором запущено ваше веб-приложение, может не иметь необходимых разрешений для запуска Word. Чтобы проверить это предположение, я бы предложил вам запустить ваше веб-приложение под учетной записью «обычного» пользователя на вашем сервере (используя, например, тег <identity ...> в вашем файле web.config). Позвольте мне еще раз процитировать цитату из статьи в КБ:

Идентификационные данные пользователя : приложения Office принимают идентификационные данные пользователя при запуске приложений, даже когда приложения Automation запускает их. Приложения пытаются инициализировать панели инструментов, меню, параметры, принтеры и некоторые надстройки на основе настроек в кусте реестра пользователей для пользователя, который запускает приложение. Многие службы работают под учетными записями, которые не имеют пользовательских профилей (например, учетная запись SYSTEM или IWAM_ [имя_сервера]). Поэтому Office может не правильно инициализироваться при запуске. В этой ситуации Office возвращает ошибку в функцию CreateObject или функцию CoCreateInstance. Даже если приложение Office может быть запущено, другие функции могут работать неправильно, если профиль пользователя не существует.

Итак, ваше веб-приложение должно работать под учетной записью Windows, имеющей профиль пользователя.

1 голос
/ 17 января 2011

Как уже говорили, плохая идея автоматизировать Word на сервере.Вы рассматривали альтернативные решения?

Если вы можете использовать исключительно формат openxml (.docx), лучше подойдет OpenXml SDK .Если вам нужно сгенерировать документы в более старом формате .doc, я бы посоветовал взглянуть на сторонний компонент, такой как Aspose, хотя это явно не бесплатное решение.

0 голосов
/ 17 января 2011

Если на этой удаленной службе не установлен Microsoft Word, вы не можете полагаться на этот код. Код использует COM-автоматизацию на компьютере, на котором работает код вашей стороны сервера.

...