Как упаковать сервис WCF из make-файла ...? - PullRequest
2 голосов
/ 17 февраля 2012

У меня есть проект WCF в Visual Studio, который мне нужно развернуть на тестовом сервере клиента.Я был на грани объявления «Миссия выполнена», когда я понял, что понятия не имею, как перенести свой проект из Visual Studio 2010 во что-то, что я могу развернуть на сервере клиента.является то, что мы используем makefile для создания и упаковки при развертывании на клиенте.Это означает, что мне нужен исполняемый файл командной строки, чтобы делать все, что мне нужно, для развертывания моей службы WCF.Я обнаружил, что щелкнул правой кнопкой мыши по проекту и выбрал «Build Deployment Package», но так как мне нужно выполнить его через командную строку, я не думаю, что это сильно поможет.эта проблема в том, что, как только я получаю упакованный файл с сервера клиента, я не уверен, что с ним делать.Теперь, если бы я знал, чего ожидать от упакованного файла развертывания, у меня могла бы быть лучшая идея, но до тех пор это всего лишь предположение.

1 Ответ

9 голосов
/ 18 февраля 2012

ОК, вот что я придумала.

Упаковка

Сначала упаковка.Используйте msbuild.Примерно так (очевидно, вам нужно использовать версию .NET версии v4 или лучше, чтобы добиться успеха):
C:/Windows/Microsoft.NET/Framework/v4.0.30319/msbuild.exe {project_file} /t:package /target:Build /p:PlatformTarget=x86;
Довольно просто, верно?

Развертывание

Теперь бонусная часть вопроса, развертывание.Это состоит из легкой части и твердой части.Самым простым было получить ZIP-файл, созданный с помощью msbuild.exe, добавленного в IIS.Я нашел 2 возможности.

Командная строка

Первая - это командная строка, которая доставила мне проблемы (что-то из-за невозможности привести ' Microsoft.Web.Deployment.DeploymentProviderOptions ' к типу '' Microsoft.Web.Deployment.DeploymentProviderOptions '--- Я ЗНАЮ, ПРАВО? ).Во всяком случае, это та командная строка, которую я использовал.Это может кому-то помочь, а может и нет.Опять же, у меня были проблемы с этим.
c:\inetpub\wwwroot>"c:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -presync:runCommand="md c:\inetpub\wwwroot\{MyWCFCodeDest} & c:\windows\system32\inetsrv\appcmd add site /name:{MyWCFCodeDest} /id:22 bindings:http/*:54095: /physicalPath:c:\inetpub\wwwroot\{MyWCFCodeDest}" -source:package={ZipFileFromMSBuild.exe} -dest:auto -setParam:"IIS Web Application Name"="{MyIISName}"

Интерфейс

ОК, поэтому я решил, что буду рад использовать второй способ.Это, безусловно, самое простое, если вы не заботитесь об автоматизации.Откройте диспетчер IIS, щелкните правой кнопкой мыши компьютер ИЛИ веб-сайт (в зависимости от того, хотите ли вы использовать его как собственный веб-сайт или приложение на существующем веб-сайте), разверните, импортируйте и следуйте указаниям мастера до конца.

Ошибки в развертывании

А теперь, где я провел большую часть своего времени.Я ударил недавно развернутый файл .svc и получил ошибку.Эта ошибка связана с сертификатом, который я использовал.Теперь, может быть, не все развертывания будут беспокоиться об этом, но мой сделал.Ошибка была длительной, что-то в "набор ключей не существует" и "невозможно активировать из-за исключительной ситуации во время компиляции" и "может не иметь закрытого ключа, которыйспособный к обмену ключами, или процесс может не иметь прав доступа к закрытому ключу ".Я перепробовал множество вещей, включая использование mmc для повторного импорта сертификатов и makecert для воссоздания как моего CA, так и моего личного сертификата.Ничто из этого не было проблемой для меня (ymmv).Наконец, я сосредоточился на правах пользователя.Я обнаружил, что если я предоставил пользователю «Все» разрешение на закрытый ключ для сертификата (сертификат должен иметь закрытый ключ), все работало.Очевидно, что это не решение, которое я хочу для клиента, поэтому я нашел правильного пользователя, которому он должен предоставить права.Удивительно, но это заняло некоторое время.На разных веб-сайтах я добавлял сетевую службу, ASPNET, текущего пользователя, пользователя, указанного в machine.config (который находится где-то в каталоге .NET), IIS_ {MachineName} ... ни один из них не работал.Я должен был добавить IIS_IUSRS .

Итак, горстка икры, которая может помочь вам в здравом уме, когда вы кричите на свой монитор, что это не работает для вас, несмотря на то, что вы следуете всем указаниям.Потому что, по-видимому, со временем IIS меняется слишком сильно, и этот материал имеет значение:
Windows 7 Ultimate sp1
IIS 7.5.7600.16385

Полезные материалы по теме

Кроме того, некоторые инструменты командной строки, которые могут вас заинтересовать:
- winhttpcertcfg.exe -l -c LOCAL_MACHINE \ My -s "{cert_name}" - список авторизованных пользователейполучить доступ к закрытому ключу сертификата (вы также можете сделать это по старинке через свойства файла);Я попытался загрузить winhttpcertcfg.exe, но он был частью пакета Windows 2003, который выдает предупреждения о несовместимости (не уверен, что это произошло из-за моей попытки установить этот файл или теперь он идет с чем-то, что я уже установил)
- winhttpcertcfg.exe -g -c LOCALHOST \ My -s "{cert_name}" -a IIS_IUSRS - добавляет IIS_IUSRS к разрешениям для закрытого ключа сертификата
- findprivatekey.exeMy LocalMachine -n ​​"{cert_name}" - Находит файл личного ключа для указанного сертификата;по какой-то причине это инструмент, который вы должны собрать в Dev Studio самостоятельно (можно найти в некоторых примерах WCF, загруженных из Microsoft)
- cacls.exe {private_key_file_for_cert} / E / G "IIS_IUSRS" - еще один способ добавить пользователя к разрешениям личного ключа
- mmc - запускает менеджер для установленного сертификата
- makecert -n "CN = {CertificateAuthorityName}" -r -sv {CertificateAuthorityName} .pvk {CertificateAuthorityName} .cer - создать сертификат центра сертификации
- makecert -sk {SignedCertName} -iv {CertificateAuthorityName} .pvk -n "CN = {SignedCertName}" -ic {CertificateAuthorityName} .cer {SignedCertName} .cer -srlocalmachine -ss My - создать сертификат, подписанный центром сертификации

И последнее: если вы хотите импортировать сертификаты с помощью mmc, вам нужно запустить mmc, File-> Add / Remove Snapin,Добавьте оснастку «Сертификаты».Импортируйте центр сертификации в доверенные корневые центры сертификации и сертификат, подписанный центром сертификации, в Personal.

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

Дополнительные открытия

Когда пришло время развертывать все на тестовом сервере (а не на моей машине для разработки), я не ожидал всех неприятностей, с которыми столкнулся.Я снова документирую это здесь, чтобы помочь какой-то другой бедной, потерянной душе (или мне позже).
-Это должно быть очевидным: FindPrivateKey.exe не на сервере.Мне пришлось прыгать через несколько обручей, чтобы получить его там.ymmv.
-Только версия 4.0 .NET клиента была установлена ​​на сервере.К тому времени, когда я обнаружил это И понял, что это проблема, прошло несколько часов.Обнаружение установленных версий .NET предоставлено netfx_setupverifier , которое я получил с одного из веб-сайтов Microsoft.Версия клиента не включает в себя все компоненты WCF.
-IIS требовались некоторые дополнительные настройки (файлы, найденные в каталоге версий .NET Framework, запускаются из командной строки):
aspnet_regiis.exe -i -enable
ServiceModelReg.exe -r
- cacls.exe сообщил мне, что он устарел и что я должен использовать icacls.exe .Командная строка для icacls выглядит примерно так:
icacls.exe {private_key_file_for_cert} /GRANT "IIS_IUSRS":R (заметьте, у меня это точно не сработало, но вы всегда можете просто зайти в файл {private_key_file_for_cert}, возможно, в ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys,и дать разрешения через проводник - щелчок правой кнопкой мыши - свойства)
- Возможно, вам понадобится добавить сопоставление обработчика для WCF.Я настоятельно рекомендую запустить его в пуле приложений .NET v4.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...