I’m working towards a more complex SignalR based post, but in the mean time part of the work on that involves setting up a few ASP.NET web apps.
If you’re after a more comprehensive guide check out this post on learn.iis.net by Thomas Deml. I’ve summarised the steps required to get some basic .NET 4 web applications deployed.
Objective
To create N identical websites in local IIS, each with an incrementing name Id. Each linked to the same application directory. The exact reason as to why will come in a future post, for now consider it an exercise in manipulating IIS via PowerShell.
s1.site.local
s2.site.local
…
Step 1 – Ensure you’re running the scripts in x86 mode.
Which seems quite common a problem, with a stackoverflow question. I haven’t worked a way around this yet, but this is the error when not running as x86:
New-Item : Cannot retrieve the dynamic parameters for the cmdlet. Retrieving the COM class factory for component with CLSID {688EEEE5-6A7E-422F-B2E1-6AF00DC944A6} failed due to the following error: 80040154.
At line:1 char:9
+ New-Item <<<< AppPools\test-app-pool
+ CategoryInfo : InvalidArgument: (:) [New-Item], ParameterBindingException
+ FullyQualifiedErrorId : GetDynamicParametersException,Microsoft.PowerShell.Commands.NewItemCommand
Step 2 – Import-Module WebAdministration
This loads the IIS namespace which allows you to just navigate in the same way you would the filesystem
> CD IIS:\
Step 3 – Create & Configure App Pool
New-Item AppPools\test.pool Set-ItemProperty IIS:\AppPools\test.pool -name "enable32BitAppOnWin64" -Value "true" Set-ItemProperty IIS:\AppPools\test.pool -name "managedRuntimeVersion" -Value "v4.0"
NOTE: here I didn’t have any luck storing the app pool path in a variable then using Set-ItemProperty, hence the repeating.
Step 4 – Variables
$sitesToCreate = 10 $path = "C:\dev\project-x\App.Web" $appPool = "test.pool"
Step 5 – Create Site & Link AppPool Loop
For N(10) to zero:
- Create a new site
- Set binding info and physical path
- Set the app pool
while ($sitesToCreate -gt 0) { $siteName = "s" + $sitesToCreate + ".site.local" $siteWithIISPrefix = "IIS:\Sites\" + $siteName Write-Host "Creating: " $siteName $site = New-Item $siteWithIISPrefix -bindings @{protocol="http";bindingInformation="*:80:" + $siteName } -physicalPath $path Set-ItemProperty IIS:\Sites\$siteName -name applicationPool -value $appPool $sitesToCreate-- }
Note: ‘appPool’ is a text variable, not the ‘Get-Item’. Set-ItemProperty operates on a path not a variable representing the item.
We’re done
One last note, to get these to resolve correctly on your local developer machine you’ll need to modify your hosts file.
The complete code up as a Github Gist.