Именованные каналы 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
, Этот занял некоторые поиски. Я наконец нашел комментарий к сообщению в блоге, которое поставило меня на правильный путь.