Использование автоматизации Office в службе WCF вызывает исключения - PullRequest
0 голосов
/ 30 августа 2011

В моем проекте мне нужно автоматизировать Excel и Word на стороне сервера для использования клиентами.Я запустил свой код в образце консольного приложения и все работает хорошо, но внутри службы WCF я получил несколько ошибок.

Мой код выглядит так:

var wordApp = new Word.Application();
wordApp.Visible = true;
wordApp.Documents.Add();

wordApp.Selection.PasteSpecial(Link: true, DisplayAsIcon: true); //Throws exception

var _excelApp = new Excel.Application();
_excelApp.Visible = true;

_excelApp.Worksheets.Add(); //Throws exception

И ошибкиявляются:

System.Runtime.InteropServices.COMException не было обработанокод пользователяHelpLink = wdmain11.chm # 24822Сообщение = указанный тип данных недоступен.Источник = Microsoft WordErrorCode = -2146822946Трассировки стека:в Microsoft.Office.Interop.Word.Selection.PasteSpecial (Object &IconIndex, Объект & Ссылка, Объект & Размещение, Объект & DisplayAsIcon,Object & DataType, Object & IconFileName, Object & IconLabel)в OfficeApiPlugin.UsingOfficeApiService.DisplyWorksheet (WorksheetRow []worksheetData)в SyncInvokeDisplyWorksheet (объект, объект [], объект [])в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Objectэкземпляр, Object [] входы, Object [] и выходы)в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc &RPC)


System.Runtime.InteropServices.COMException не было обработано пользователемкодСообщение = Исключение из HRESULT: 0x800A03ECИсточник = Microsoft.Office.Interop.ExcelErrorCode = -2146827284Трассировки стека:в Microsoft.Office.Interop.Excel.ApplicationClass.get_Worksheets ()в OfficeApiPlugin.UsingOfficeApiService.DisplyWorksheet (WorksheetRow []worksheetData) в C: \ Users \ Mahdi7s \ Documents \ Visual Studio2010 \ Projects \ OfficeApiPlugin \ OfficeApiPlugin \ UsingOfficeApiService.cs: линия29в SyncInvokeDisplyWorksheet (объект, объект [], объект [])в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Objectэкземпляр, Object [] входы, Object [] и выходы)в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc &RPC)

Как я могу сделать это без этих ошибок?

1 Ответ

0 голосов
/ 30 августа 2011

Я думаю, что проблема в том, что буфер обмена (который является взрывной операцией) требует использования потока STA COM.Вызовы WCF выполняются в потоках пула потоков, которые являются потоками MTA.

Раскрутите свой собственный поток с помощью класса Thread и установите для его ApartmentState значение ApartmentState.STA, а затем выполните автоматизацию Office оттуда.В таком случае проще всего будет блокировать ваш поток WCF до тех пор, пока автоматизация не будет завершена.

Однако следует помнить несколько вещей:

  1. Если у вас много одновременныхвызовов, вам нужно будет создавать пул потоков STA вместо того, чтобы каждый раз увеличивать поток.
  2. Для более высокой пропускной способности вы можете рассмотреть возможность сделать вашу операцию службы асинхронной и создать собственный IAsyncResult, который сигнализирует при автоматизациизавершено.Это позволит повторно использовать поток WCF во время автоматизации.
...