Размещение службы WCF на основе TCP на тех же портах, что и IIS (через службу активации Windows) в Azure WebRole - PullRequest
1 голос
/ 24 мая 2011

Как настроить веб-роль Azure при использовании WCF на основе TCP на тех же портах, что и IIS?

В локальном решении обычно используется активация WAS, однако обычно для этого требуются настройки разрешений для HTTP.порты и т. д. В Windows Azure этот интерфейс недоступен.

1 Ответ

1 голос
/ 29 мая 2011

Лучший способ разместить службу WCF в Azure WebRole - это использовать Служба активации Windows (WAS) .Обычно это необходимо, когда вы хотите предоставить веб-контент (HTTP) и некоторые службы WCF на основе TCP на одних и тех же портах (80 или 443).

Вот сценарий PowerShell, который включает службу TCPPortSharing, инастроить IIS соответствующим образом.Хотя это работает для Azure, с небольшими изменениями вы можете использовать это и для локального сервера Windows 2008 R2.

#adding this to be sure that IISConfigurator has a chance complete

Add-Content -path .\trace.txt "Starting...$([Datetime]::Now.ToString())" 

Start-Sleep -s 300

Add-Content -path .\trace.txt "Adding Microsoft.WindowsAzure.ServiceRuntime..."
Add-PSSnapin Microsoft.WindowsAzure.ServiceRuntime
while (!$?)
{
    Add-Content -path .\trace.txt "Failed to add Microsoft.WindowsAzure.ServiceRuntime, retrying after five seconds..."
    sleep 5

    Add-PSSnapin Microsoft.WindowsAzure.ServiceRuntime
}

Add-Content -path .\trace.txt "...done adding Microsoft.WindowsAzure.ServiceRuntime $([Datetime]::Now.ToString())"

#Start the Net.TCP Port Sharing and Net.Tcp Listener Adaptor services.. (TODO:Not sure if we need to set this to auto)

Add-Content -path .\trace.txt "Setting NetTcpPortSharing & NetTcpActivator service startup to auto... $([Datetime]::Now.ToString())"

Set-Service NetTcpPortSharing -StartupType Automatic
Set-Service NetTcpActivator -StartupType Automatic

Add-Content -path .\trace.txt "...done Setting NetTcpPortSharing & NetTcpActivator service startup to auto ... $([Datetime]::Now.ToString())"

Add-Content -path .\trace.txt "Starting NetTcpPortSharing & NetTcpActivator services ... $([Datetime]::Now.ToString())"

Start-Service -name NetTcpPortSharing
Start-Service -name NetTcpActivator

Add-Content -path .\trace.txt "... done Starting NetTcpPortSharing & NetTcpActivator services $([Datetime]::Now.ToString())"

#Get the Role Instance Id

Add-Content -path .\trace.txt "Getting the RoleInstance ID... $([Datetime]::Now.ToString())"

$roleInstance = Get-RoleInstance -current
$roleInstanceId = $roleInstance.Id

$siteName = '_Web'  #This is the site name from the <Site> tag in ServiceDefinition.csdef

Add-Content -path .\trace.txt "Instance ID : $roleInstanceId"

Add-Content -path .\trace.txt "... done Getting the RoleInstance ID $([Datetime]::Now.ToString())"

#Create the bindingCmd

#Add-Content -path .\trace.txt "Building commands ..."

#$addBindingCmd =  "set site `"" + $roleInstanceId + "_" + $siteName + "`" -+bindings.[protocol='net.tcp',bindingInformation='808:*']"
#$enableNetTcpCmd =  "set app `"" + $roleInstanceId + "_" + $siteName + "`" /enabledProtocols:http,net.tcp"

Add-Content -path .\trace.txt -value $addBindingCmd
Add-Content -path .\trace.txt -value $enableNetTcpCmd
Add-Content -path .\trace.txt -value "...done Building commands"

set-alias appCmd $env:windir\system32\inetsrv\appcmd.exe

Add-Content -path .\trace.txt -value "Adding Net.Tcp binding... $([Datetime]::Now.ToString())"

#add the binding..
#appCmd $addBindingCmd 

appCmd set site `"$roleInstanceId$siteName`" /debug -+"bindings.[protocol='net.tcp',bindingInformation='808:*']" >>trace.txt

Add-Content -path .\trace.txt -value "done Adding Net.Tcp binding"

Add-Content -path .\trace.txt -value "Enable Net.Tcp... $([Datetime]::Now.ToString())"
#appCmd $enableNetTcpCmd
appCmd set app "$roleInstanceId$siteName/" /debug /enabledProtocols:"http,net.tcp" >> trace.txt
Add-Content -path .\trace.txt -value "done Enable Net.Tcp"

Add-Content -path .\trace.txt -value "End $([Datetime]::Now.ToString())"
...