2016-01-04 13 views
0

Я предупреждаю вас, что этот вопрос будет очень странным для многих людей :) Но я должен опубликовать его, потому что мой руководитель проекта говорит мне, что техническое решение существует, даже если для меня это не так.Удаленная автоматизация MS Office на сервере

Что мы имеем:

  • консольного приложения под управлением Windows 7, без пользовательского интерфейса, с нашей C# приложение работает и не офиса и Interop на нем
  • под управлением Windows 2012 сервер с Ms Office 2010 + Interop установлен на нем (также с IIS и .NET конечно)

Что моя PM хотите (и я сказал ему, что это не возможно):

  • От моего клиентского приложения C#
  • Автоматизация «Офис Ms», установленного на сервере
  • Автоматизация означает «Сохранить» или «распечатать» файл документа на сетевом принтере.
  • Конечно процесс офиса Ms должен был работать на сервере

Такого рода решение «удаленная автоматизация Ms Office возможна», кажется, невозможно для меня. Но, может быть, я ошибаюсь, можно использовать DCOM, WCF или что-то еще?

Любой человек может подтвердить, что я прав, пожалуйста;)

+0

Чтобы уточнить, что он хочет сделать, это в основном запустить версию Office, установленную на удаленном сервере в вашем приложении, чтобы клиент мог выполнять все функции? Или просто выберите документы для печати и распечатайте их через Office, установленный на удаленном сервере? – Taegost

+1

Это, конечно, возможно, но это непросто. Однако решение было бы слишком сложным, чтобы публиковать в качестве ответа здесь. Вам в основном нужно создать WCF или веб-службу, которая печатает документы и которая вызывается вашим клиентским приложением. –

+0

@Taegost, что он, я хочу выполнить действие (печать, сохранение документа) из моего клиентского приложения, без установки Ms-офиса на моем клиенте. Вид дистанционного использования interop :) – sstassin

ответ

1

Как вы уже узнали из комментариев, автоматизируя настольную версию любого из приложений Office, это плохо по нескольким причинам. Подробности можно найти в статье базы знаний KB257757 Considerations for server-side Automation of Office. Основным уходом от этой статьи является:

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

Но, поскольку вы все еще настаиваете на этом, рассмотрите следующий пример как очень простой, наивный, который не должен использоваться рядом с концепцией доказательств, позволяющей быстро справиться со всеми проблемами, упомянутыми в статье KB.

В новом решении создайте приложение службы WCF и консольное приложение. В приложении WCF добавьте следующий интерфейс:

[ServiceContract] 
public interface IPrintService 
{ 
    [OperationContract] 
    string Print(Stream wordDoc); 
} 

и иметь сервисный инструмент, который. Обязательно добавьте ссылку на Microsoft.Office.Interop.Word, которую вы можете найти на вкладке COM диалогового окна Добавить ссылку.

public class PrintService : IPrintService 
{ 
    public string Print(Stream wordDocStream) 
    { 
     // copy our stream to a local file 
     var tempFile = Path.GetTempFileName(); 
     using(var file = File.Create(tempFile)) 
     { 
      wordDocStream.CopyTo(file); 
     } 

     // start word 
     var wordApp = new Microsoft.Office.Interop.Word.Application(); 
     // setup printer 
     wordApp.ActivePrinter = "Canon LBP3010/LBP3018/LBP3050"; 
     // open, collect data, print and close 
     var doc = wordApp.Documents.Open(tempFile); 
     doc.PrintOut(); 
     var res = doc.Words.Count; 
     doc.Close(false); 

     // quit word 
     wordApp.Quit(false); 
     // delete temp file 
     File.Delete(tempFile); 
     return String.Format("{0} words", res); 
    } 
} 

Вы можете увидеть здесь barebone-решение для печати документа, который отправляется как поток в Службу. Служба копирует поток в файл, запускает Word, открывает файл, распечатывает документ, получает некоторые данные из документа и срывает и очищает курицу.

Клиент прямо вперед:

using(var client = new PrintService.PrintServiceClient()) 
{ 
    using(var file = File.Open(@"small.docx", FileMode.Open)) 
    { 
     var response = client.Print(file); 
     Console.WriteLine(response); 
    } 
} 

Это технически все, что необходимо, чтобы напечатать документ Word, от службы. Это работает без особых проблем на dev-сервере. Если вы запустите это в IIS, вам, вероятно, придется убедиться, что учетная запись, используемая как идентификатор в AppPool, является «пользователем», который может запускать Word, имеет доступ к принтерам и т. Д. Я уже столкнулся с одной известной проблемой: Я использовал драйвер печати XPS, который вызвал всплывающее диалоговое окно. Это то, что вы не можете иметь на сервере, и нет реального способа предотвратить или обнаружить это.

Помните, что этот служебный интерфейс позволяет только передавать поток. Если вы хотите добавить дополнительные данные, вам придется использовать контракт с сообщением, как описано в msdn в Large Data and Streaming. Ваш контракт должен будет выглядеть в этом случае:

[MessageContract] 
public class UploadStreamMessage 
{ 
    [MessageHeader] 
    public string appRef; 
    [MessageBodyMember] 
    public Stream data; 
} 

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

+0

Благодарим вас за очень подробный ответ. Il попытается реализовать это на нашем веб-сервере Intranet. Мне известны все соображения MS о том, что «не использовать ms office в режиме сервера», но в настоящее время это лучший способ распечатать сложный документ с очень хорошей точностью. – sstassin

+0

Благодарим вас за редактирование моего плохого набора текста :) – sstassin