Word в ASP.NET 2.0

asppp
Дата: 20.04.2007 10:25:45
Вот такой простой код :
protected void Button1_Click(object sender, EventArgs e)
{
object missing = Type.Missing;
object fileName = Server.MapPath(Request.ApplicationPath) + @"\DOT\Forma1.rtf";
Word.ApplicationClass ap = new Word.ApplicationClass();
Document doc = ap.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);

object wdrepl = Word.WdReplace.wdReplaceAll;
object searchtxt = "fio";
object newtxt = "Иваноff";
object frwd = true;
doc.Content.Find.Execute(ref searchtxt, ref missing, ref missing, ref missing, ref missing, ref missing, ref frwd, ref missing, ref missing, ref newtxt, ref wdrepl, ref missing, ref missing,
ref missing, ref missing);
ap.Visible = true;
}

Подключены соответственно:
using Microsoft.Office.Interop.Word;
using Word = Microsoft.Office.Interop.Word;

Почему из студии (по F5) этот код отрабатывает отлично, т е открывается Ворд и происходит замена в шаблоне fio на Иваноff. Работает как надо.

Если же я его запускаю просто из IE6, то вылетает ошибка при выполнении Button1_Click:

Сбой при получении фабрики класса COM для компонента с CLSID {000209FF-0000-0000-C000-000000000046} в результате следующей ошибки: 80070005.
Описание: Необработанное исключение при выполнении текущего веб-запроса. Изучите трассировку стека для получения дополнительных сведений о данной ошибке и о вызвавшем ее фрагменте кода.

Сведения об исключении: System.UnauthorizedAccessException: Сбой при получении фабрики класса COM для компонента с CLSID {000209FF-0000-0000-C000-000000000046} в результате следующей ошибки: 80070005.

ASP.NET не имеет права обращаться к запрошенному ресурсу. Рекомендуется предоставить идентификатору запроса ASP.NET права доступа к этому ресурсу. ASP.NET имеет базовый идентификатор процесса (обычно {MACHINE}\ASPNET для IIS 5 или Network Service на IIS 6), который используется, если приложение не олицетворяется. Если приложение олицетворяется через задание <identity impersonate="true"/>, идентификатором будет служить идентификатор анонимного пользователя (обычно IUSR_MACHINENAME) или идентификатор пользователя запроса с проверенной подлинностью.

Для предоставления ASP.NET прав на запись в файл, щелкните на файле правой кнопкой мыши в окне "Проводник", выберите "Свойства", затем вкладку "Безопасность". Выберите "Добавить" для добавления соответствующего пользователя или группы. Выделите учетную запись ASP.NET и установите флажки для требуемых прав доступа.

Ошибка источника:


Строка 42: object missing = Type.Missing;
Строка 43: object fileName = Server.MapPath(Request.ApplicationPath) + @"\DOT\Forma1.rtf";
Строка 44: Word.ApplicationClass ap = new Word.ApplicationClass();
Строка 45: Document doc = ap.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing,
Строка 46: ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,


Строка Строка 44: Word.ApplicationClass ap = new Word.ApplicationClass(); выделена красным цветом. В ней проблема?? Как быть?
hamster
Дата: 20.04.2007 10:33:51
С правами проблема.
1) Заходишь меню пуск, выполнить, вписываешь dcomcnfg, нажимаешь энтер.
2) Разворичаваешь Component Services > Computers > My computer > DCOM Config
3) Ищешь там нод "Документ Microsoft Word"
4) Правой кнопкой на него и в Properties
5) Поиграйся с вкладками Security и Identity.
Программеры курят быстро. Потому что мысль. Потому что она уйдет и придется думать ее снова...
asppp
Дата: 20.04.2007 10:44:30
уже кое-что.....
настроил в Службе компонентов права для ASPNET и IUSR_COMPNAME ошибка уже не вылетает, но процесс Ворда запускается хотя сам он после команды ap.Visible = true; не появляется. Процесс winword.exe в системе висит а Ворд не открыт. В чем может быть дело?
hamster
Дата: 20.04.2007 10:49:13
а если doc.Visible?
Программеры курят быстро. Потому что мысль. Потому что она уйдет и придется думать ее снова...
hamster
Дата: 20.04.2007 10:50:05
А зачем тебе его на сервере кстати показывать? его же всё равно клиент не увидит))
Программеры курят быстро. Потому что мысль. Потому что она уйдет и придется думать ее снова...
asppp
Дата: 20.04.2007 10:56:28
doc.Visible- нет такой команды..она на Application работает

как это клиент не увидет ????!!! серьезно что ли ? ты так не шути!!!...))
а как быть с Ворд-отчетом, в котором надо в шаблоне заменить поля на определенный текст?????
hamster
Дата: 20.04.2007 11:00:21
У тебя процесс ворда стартует на сервере. Клиент ничегоо не увидит.
Программеры курят быстро. Потому что мысль. Потому что она уйдет и придется думать ее снова...
asppp
Дата: 23.04.2007 06:26:51
Как тогда клиенту организовать отчет в Ворде со вставкой нужных значений полей из базы ????
Sender
Дата: 23.04.2007 14:14:46
asppp
Как тогда клиенту организовать отчет в Ворде со вставкой нужных значений полей из базы ????


1. Сгенерировать документ.
Если это текст (вроде договора) сделать шаблон в котором есть текст и в тексте вставлены псевдополя, т.е. записи вроде &FIO; &Field2; затем открыть его, осуществить поиск/замену псевдополей значениями из таблицы, сохранить документ, отключиться о него.

Если это таблица - сделать шаблон в котором есть шапка и одна пустая строка, дальше добавлять строку, заполнять её ячейки записями из таблица (циклом построчно/поячеечно), сохранить документ, отключиться о него.

Если и то и другое - комбинировать методы.

2. Передать клиенту ссылку на сохраненный файл, он его загрузит к себе и откроет на своей машине, в своём Ворде.

2. Альтернативный. Купить или найти бесплатный(если такие бывают) Word Processor или Text Processor или RTF Processor для ASP.NET 2.0 и показывать вордовский документ прямо в окне браузера с возможностью редактирования.
Anri
Дата: 25.06.2007 20:34:14
1. создаём локальную группу юзверов на сервере (важно), или мржем использовать уже имеющуюся
три варианта:
тупой
открываем DCOMCNG и находим там объект Word Document, открываем последнюю закладку и говорим, чтоб ворд пускался под заранее созданным определённым польователем, которого заранее добавили в администраторы

нормальный
1. тебе пофик под кем создавать документы на сервере и тогда создаём юзвера, скажем Pupkin, помещаем его в  заранее группу
2. открываем DCOMCNG и находим там объект Word Document, открываем заклатку с секретностями и добавляем созданную группу в двух верхних клавишах. Закладу идентификации не трогаем.

если у вас сложная доменная система с правами и правилами
то вам нужно просто группы или отдельных пользователей с контролера доменов добавить в эту группу, а потом выполнить над Word Document объектом то, что стоит под цифрой 2 пунктом выше.


Если у вас на сервере стоят приблудные программы, скажем генерации ПДФ фалов (или какой-нибуть программный принтер в хитрый формат) то тупой вариант вам не светит. Поскольку все эти приблуды будут просить от вас запускат вод исключительно под system account, что сразу приведёт к конфиликтам и пр.

Показывать, ессно ни кому ворд не надо. Создали объект, сгенерировали шо вам там надо, вывели результат в респонз, выставили правильный ContentType, закрыли нафик объект Word и отдали страничку юзверу.

ПыСы AppID с последующими думками о Word.Application хитрым CLID = {000C101C-0000-0000-C000-000000000046} - это танцы с бубном и пахнут плохо. Microsoft Word-Dokument - единственный объект требующей настройки перед его использованием на сервере в виде приложения-генератора MS Word документов