2011-03-24 4 views
3

У меня возникла проблема с открытием документа с использованием Microsoft Word с ASP.NET MVC.Documents.Add не работает на ASP.NET (VB.NET)

Это отлично работает на моей машине-разработчике, но не при развертывании до IIS.

Dim word = New Microsoft.Office.Interop.Word.Application 

'This line is failing to return a document object 
Dim letter = word.Documents.Add(letter_doc_path) 

'This line then fails due to [letter] being null 
letter.MailMerge.OpenDataSource(csvPath) 

Я добавил разрешение в «Component Services» (DCOMCNFG) пользователю услуги сети, которая позволяет создавать объект Word, в первую очередь, но я полностью застрял в том, что делать с этим.

Я также попытался подавляя диалоги Word, с помощью следующей строки только в случае

word.DisplayAlerts = Microsoft.Office.Interop.Word.WdAlertLevel.wdAlertsNone 

Вопрос не помогает, не имея ошибку (не считая ссылки нулевого объекта очевидно) - может быть, есть способ запросить Word для сообщения об ошибке?

+0

Может потребоваться разрешение на создание временных файлов? – StingyJack

+0

@StingyJack - я тоже подумал об этом, и это может быть связано, но после второй строки он фактически создает файл temp.doc temp, как будто документ открыт (и память слова увеличивается, как будто документ открыт) – wheelibin

ответ

4

Слово требует normal.dot файл шаблона при открытии любого документа, проблема возникла из-за того, что пользователю IIS не удалось создать файл normal.dot, чтобы он не работал в фоновом режиме.

Это было исправлено установкой UserTemplate путь для вновь созданного экземпляра слова (сразу после его создания).

Путь должен быть доступен для записи пользователем IIS (NETWORK SERVICE в моем случае).

word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder 

Так что для полноты картины, вот оригинальный пример с выигрышной линии включены:

Dim word = New Microsoft.Office.Interop.Word.Application 

'this line fixed it 
word.Options.DefaultFilePath(Microsoft.Office.Interop.Word.WdDefaultFilePath.wdUserTemplatesPath) = working_folder 

Dim letter = word.Documents.Add(letter_doc_path) 
+0

Замечательно, что вы это проработали и задокументировали. +1. Вы можете пойти дальше и принять свой собственный ответ с полым флажком рядом с ним. –

0

Я не уверен, как вы поймаете ошибки.

Пожалуйста, взгляните на следующие страницы, если вы найдете какую-то подсказку.

+0

Привет, я «поймаю ошибки», используя блок try/catch, который выдает «Объектную переменную или с переменной блока не заданной» на третьей строке из-за сбоя Documents.Add без ошибок. Я боюсь, что ни одна из этих ссылок не поможет в решении этой проблемы - спасибо в любом случае – wheelibin

0

У меня была такая же проблема, и настройки, которые wheelibin предложенные было недостаточно для создания документов с использованием учетной записи NETWORK SERVICE.

То, что я в конечном итоге делает это:

  • Создайте учетную запись пользователя для этого процесс для запуска в.

  • Войти как пользователь и запустить Word (это делает различные задачи настройки в Слове так приложение не пытается положить вверх модальные диалоговые окна при работе в качестве службы).

  • Создайте новый пул приложений и установите пул для запуска в качестве учетной записи пользователя.

Если вы используете Windows, аутентификации, и ваш сервер для Windows 2003 (или 2000, предположительно), затем this issue применяется, и вы необходимо либо изменить SPN сервера , который будет разбит Windows Аутентификация для любого приложения , работающего под учетной записью другого пользователя , или вам необходимо переключить поставщик проверки подлинности на NTLM вместо Kerberos.

IIS 7 может использовать аутентификацию в режиме ядра, чтобы избежать проблемы.

Смежные вопросы