I’ve never really used the Website project template in Visual Studio but I have heard from several developers that do. Unlike Web Application projects, Microsoft does not provide MSDeploy integration during the build process for Websites. But there is no reason it wouldn’t work. In this blog post we will create a custom MSDeploy package for a Website.
First, if you don’t have a good understanding of WebDeploy/MSDeploy packages you should review my Anatomy of a WebDeploy Package blog post as a primer.
MSBuild Differences
Web Application projects have a project file (.csproj or .vbproj) which controls how the project is built and provides many further features above and beyond the capabilities of a Website. A Website does not require compilation but you can optionally precompile the site if you like.
Because this is optional, it appears Microsoft did not invest in MSDeploy integration for Website builds. This means that creating a MSDeploy package or deploying directly from MSBuild using the following MSBuild arguments will not work:
/P:DeployOnBuild=True /P:DeployTarget=MSDeployPublish /P:MsDeployServiceUrl=https://localhost:8172/msdeploy.axd /P:AllowUntrustedCertificate=True /P:MSDeployPublishMethod=WMSvc /P:CreatePackageOnPublish=True
The following MSDN article provides a more thorough comparison between website and web applications.
https://msdn.microsoft.com/en-us/library/dd547590(v=vs.110).aspx
Create a custom MSDeploy Package
The website folder contains all the files we need to deploy the site to IIS.
So all we need to do is create a MSDeploy package from this folder.
In this situation, it makes sense to use manifest files because we also want to create the application in IIS. So we will start with manifest.source.xml file:
<?xml version="1.0" encoding="utf-8"?> <sitemanifest> <!--TODO: Update to your custom website location--> <contentPath path="C:\temp\WebsiteMSDeployPackage\WebSite1" /> <createApp path="" /> </sitemanifest>
Here we specify the website directory to be packaged. The createApp provider is simply a placeholder to match the destination manifest.
Next we call MSDeploy to create a package based on the source manifest file.
"c:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:manifest="manifest.source.xml" -dest:package=websitepackage.zip
In order to deploy the package we must have a corresponding manifest.dest.xml file:
<?xml version="1.0" encoding="utf-8"?> <sitemanifest> <!--TODO: Update to your desired application name.--> <contentPath path="Default Web Site/CustomPkgWebsite2" /> <createApp path="Default Web Site/CustomPkgWebsite2" /> </sitemanifest>
Here we are setting the destinations for both the contentPath and createApp to the same IIS web application path. Note in both manifest files you must customize the paths for your application.
Finally, we can deploy our package using MSDeploy.exe using the package for the source and our manifest as the destination:
"c:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -source:package="%cd%\websitepackage.zip" -dest:manifest=manifest.dest.xml
And that’s it, we have successfully deployed a website to IIS.
Other Custom Packages
This same technique should work with any type of IIS hosted application. For example, you could use this to package a PHP web application. Or you could create your own custom packages for a web application with a similar approach instead of using the typical WebDeploy process.
The Source
If you want to try this for yourself you can clone the source from Github.
thanks! I’m curious about passing in the contents of the manifest files via command line. I need to be able to build these commands dynamically. Is this pohttps://gravatar.com/site/signup/ssible?
I figured that would be a question that comes up. You could use WebDeploy Parameterization to declare/set parameters using the ProviderPath kind from the MSDeploy commandline. http://forums.iis.net/t/1179672.aspx
I may write a follow-up post to cover this.
I needed this methodology in order to get web deploy packages working for .net core. This saved me a ton of time so thank you!
Your very welcome. Thanks for sharing your success!
Pingback: Package ASP.NET Website (not App) in a CI Build – dotnet catch
As an alternative you can using the following command to auto generate the package through msbuild
msbuild “” /t:Package /p:PackageLocation=”” /p:OutputPath=””
sorry my place holders had html like tags in them
msbuild “website project file” /t:Package /p:PackageLocation=”destination folder” /p:OutputPath=”temporary location for publushed websites”
Thanks for sharing!
Upon further review I had thought I was using website projects… but turns out I was using web application projects, website projects do not have their own proj files. Please delete my previous comments
Sorry for the bad information
Thanks for an excellent article.
I have a question related to the same. I have 10 projects that generate nuget packages. Now I am trying to see if there is way I can create a webdeploy ? Note: I tried creating a empty web app and created packages.config and referred all the 10 nuget packages and did a restore and all that is working but it creates unnecessary files like Roslyn folder all that. Just trying to see if there is a better way.
Can you explain further? Not sure exactly what your trying to do.