Именованные каналы WCF и веб-роли Azure

Я потратил слишком много времени, стуча головой об стену для этого.

Запуск Azure SDK 1.7 / Visual Studio 2010 Ultimate. Я не могу запустить службу WCF по именованным каналам, размещенным в IIS/WAS. Любая попытка подключиться к моему сервису в эмуляторе вычислений приводит к

Конечная точка канала "net.pipe://localhost/services/MyService.svc" не найдена на вашем локальном компьютере

Я собирался опубликовать свой код, но оказалось, что пример кода из этой статьи http://blogs.msdn.com/b/tomholl/archive/2011/06/28/hosting-services-with-was-and-iis-on-windows-azure.aspx выдает мне точно такую ​​же ошибку. Весь код доступен на этом сайте.

Насколько я могу судить, задачи PowerShell успешно выполняются. (Ну, ладно, мне пришлось изменить ExecutionPolicy с Unrestricted на RemoteSigned в задаче запуска, но после этого он работал нормально.) Служба NetPipeActivator работает, и когда я вызываю Get-WebApplication, в протоколе отображается net.pipe. список:

PS C:\> $WebRoleSite = (get-website "*webrole*").Name
PS C:\> Get-WebApplication -Site $WebRoleSite

Name             Application pool   Protocols    Physical Path
----             ----------------   ---------    -------------
WcfService1      4a16b147-f9ac-41d9 http,net.pip c:\Code\WasInAzure\WcfService1
                 -9543-0577da64fb9a e

Что еще может происходить?

2 ответа

Решение

Я решил это. Уф!

Моя проблема заключалась в том, что я размещал свой сервис WCF из корневого веб-сайта, а не дочернее приложение. Мне пришлось добавить следующую строку в скрипт powershell, чтобы включить именованные каналы на главном веб-сайте:

Set-ItemProperty "IIS:/Sites/$WebRoleSite" -Name EnabledProtocols 'http,net.pipe'

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

Основным отличием стало то, что атрибут osFamily элемента ServiceConfiguration в файле ServiceConfiguration.csfg.

В примере он установлен на "2:"

<ServiceConfiguration serviceName="WasInAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="2" osVersion="*" schemaVersion="2015-04.2.6">

В более новых проектах он установлен на "4:"

<ServiceConfiguration serviceName="WasInAzure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2015-04.2.6">

Изменение в ОС нарушает сценарий PowerShell. Вот обновленная версия RoleStart.ps1, которая должна работать на Server 2012 R2 (osFamily 4):

write-host "Begin RoleStart.ps1"
import-module WebAdministration 

# Starting the listener service 
install-windowsfeature -name AS-Named-Pipes
$listenerService = Get-WmiObject win32_service -filter "name='NetPipeActivator'"
$listenerService.ChangeStartMode("Manual")
$listenerService.StartService()

# Enable net.pipe bindings
$WebRoleSite = (Get-WebSite "*webrole*").Name
Get-WebApplication -Site $WebRoleSite | Foreach-Object { $site = "IIS:/Sites/$WebRoleSite" + $_.path; Set-ItemProperty $site -Name enabledProtocols 'http,net.pipe'}
New-ItemProperty "IIS:/Sites/$WebRoleSite" -name bindings -value @{protocol="net.pipe";bindingInformation="*"}

write-host "End RoleStart.ps1"

Сводка изменений:

  • добавленной install-windowsfeature -name AS-NamedPipes, так как службы NetPipesActivator не было.

  • обновленный EnabledProtocols в enabledProtocols, Этот занял некоторые поиски. Я наконец нашел комментарий к сообщению в блоге, которое поставило меня на правильный путь.

Другие вопросы по тегам