如何从 Visual Studio 2015 (+U1) ASP.NET Core 发布到 Windows Server 2012R2 上的 IIS?
Posted
技术标签:
【中文标题】如何从 Visual Studio 2015 (+U1) ASP.NET Core 发布到 Windows Server 2012R2 上的 IIS?【英文标题】:How can I publish from Visual Studio 2015 (+U1) ASP.NET Core to IIS on Windows Server 2012R2? 【发布时间】:2016-01-06 19:20:48 【问题描述】:这个问题可以被认为是两年前的一个更新,询问如何从 Visual Studio 2015 中的开放 ASP.NET Core 解决方案(then called ASP.net vnext,简称为 ASP.NET 5)发布到另一台机器上我的本地网络,上面部署了 IIS,应该用于运行 DNX 运行时和我正在编写的 ASP.NET 应用程序。由于该向导对我没有帮助,我相信我将不得不完全手动配置 MSDEPLOY 解决方案及其配置文件,或者其他等效的东西。
自最初的问题以来情况发生了很大变化,所以我要求使用 ASP.NET 5 和 DNX 1.0 RC1。
有一些 related 其他 questions 询问如何执行此操作并提到 WebDeploy 3.6,并且还指的是近 2 年的 beta 版本。
因此,我相信这个问题对于 Visual Studio 2015 应该有一个新的和不同的答案,因为 ASP.NET 5 处于候选发布版本并且功能完整。现在怎么样了?
还应该明确指出,我不是在谈论从 C:\DEV\WORKINGCOPY
上的 Visual Studio 解决方案部署到我自己机器的 c:\inetpub\wwwroot
,而是通过网络复制,通过 web-dav、FTP 或 SMB共享,到运行 IIS 的 windows 服务器框。
到目前为止我所尝试的:
在文件系统模式下使用内置的“发布到 Web”向导。结果似乎是您可以通过 web.cmd 运行的东西,它将执行 dnx 和 kestrel,但不会构建可从 Windows Server 2012 上的 IIS 8.x 运行的包。此外,发布到文件系统模式会创建一堆包括一组名为 approot、logs 和 wwwroot 的基本文件夹,我很确定 IIS 不应该设置为直接提供 approot 或日志文件夹。如果我从 IIS 中查看 wwwroot\ 文件夹的副本,我会看到 500 - Internal server error。这就是我希望 IIS 在不知道如何将 web.config 放入其中并对其进行任何操作时所做的事情。
尝试从命令提示符手动使用dnu publish
和dnu pack
,我的想法是也许我可以使用结果替换我的 XYZ-publish.ps1 powershell 文件 PublishProfiles 的内容。 dnu 发布命令失败,并显示“bower 未被识别为内部或外部命令”。 dnu pack 成功,但我不知道如何处理生成的 .nupkg 文件以使其在 IIS 上运行。
我的总体目标是:
只需单击一下或键入一个命令即可完成所有工作,包括任何捆绑和构建任何预编译程序集(nuget 程序包是 vNext 与经典 .net 程序集等效的概念)。
为了让我自己和其他读者清楚,在准备部署之前在 IIS 上一次性设置任务是什么,每次单击发布时为您完成的任务是什么,以及如何设置它们。
这似乎是一个基本领域,此时 ASP.NET 5 上的文档非常薄弱,并且该工具目前仅针对希望将包部署到文件夹并从“dnx web”运行它的人进行了优化" (kestrel),或者对于那些想要在 Azure 上部署的人(对于那些在发布向导中的情况,这个过程是完全自动化的)而不是那些想要部署到他们自己运行 IIS 的机器上的人。发布向导缺少这个(对我而言)极其明显的案例;发布到我自己的 Windows 服务器盒,并创建我需要的任何 IIS 脚手架以使其正常工作。
【问题讨论】:
如果反对者能指出这个问题有什么问题,我们将不胜感激。 bower 工具似乎未随 Visual Studio 分发。要让它安装 NodeJs,然后键入npm install bower -g
以在路径中安装并作为命令行工具访问 bower,您可能必须手动将 c:\users\youraccountname\appdata\roaming\npm
添加到路径中
我认为你的想法是通过脚本组合这些东西。 IOW,您创建一个运行 bower/npm/gulp 等的脚本,然后将 dnu 发布到本地或网络位置,并可选择从那里发布。不过,今天的 IIS 故事完全烂透了。目前让 DNX 应用程序在 IIS 上崩溃是一件痛苦的事情。我怀疑这将在 RC2 中通过新工具得到解决,如果没有,那么肯定会在发布时解决。
很好,他们最好改进这个工具,因为它目前很糟糕。但是我想让它现在开始工作,这样我就可以让我的开发团队进行持续交付,所以我会学习并找出解决方案并在此处记录。我在下面的临时答案中未解决的一件事是“将 DNVM/DNX/DNU 工具和依赖项安装在它们在 IIS 中变得可见/可用/可操作的上下文中”。
【参考方案1】:
更新:Microsoft's Connect 2015 demo suite called Healthcare.biz 包含一个基于 powershell 的部署方案(用于 azure),它可能适用于本地 IIS 服务器。请参阅该 GitHub 存储库中的 PublishAspNet5Website.ps1 powershell 脚本。
这个问题有很多元素,我找不到任何一个可以识别所有元素的来源。
首先需要在 IIS 服务器上进行一些设置,根据 this question,您必须选择将用于运行 DNX/ASP.NET 5 应用程序的应用程序池。您还应该创建一个虚拟文件夹,然后将其转换为应用程序。根据那个链接的问题,您应该使用 .NET 4 池。 IIS 服务器上的其他设置可能包括设置服务器端工具以接受来自 Visual Studio(IDE 内部)和 msbuild 命令行(持续集成服务器)部署工具的传入发布请求。
由于 Visual Studio 2015 中的向导(包括更新 1 中的向导)不提供“部署到域上的 Windows Server”之类的选项,因此您必须研究现有选项,例如文件模式部署选项和天蓝色部署选项,并根据这两个起点之一选择一些混合方法。您的资产包括 powershell 的所有功能,以及 dnx/dnu 工具的所有功能,包括它的 bower 集成。您将根据需要捆绑/构建/编译,然后将结果发送到 MSDEPLOY 工具,然后您需要为其编写配置 (.pubxml) 文件。您还可以选择完全忽略 DEPLOY 命令,并选择通过添加到 dnx 项目的“暂存”动词进行部署,以部署到暂存服务器。
为了希望将微不足道的起始文件集修改为完成问题中指定的工作所需的条件,您可能必须阅读有关 MSDEPLOY 的文档。在互联网上搜索我发现有一些示例 .pubxml 文件 here 并在那里显示了 .pubxml 是如何构造的。在您的部署配置文件文件夹中,您将需要至少一个正确构建的 .pubxml 文件,以及另一个具有相同基本名称和扩展名 .ps1(powershell)的文件,无论您使用哪种技术,它似乎都是相同的,所以在我看来它存在的唯一原因是你可以在那个 powershell 中完成其他任务。
.pubxml 内容示例
<?xml version="1.0" encoding="utf-8"?>
<!--
NOTE: I'm pretty sure that the publishprovider should NOT be the one shown here.
I do not know what it should be and will update this answer when I figure that fact out.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<ADUsesOwinOrOpenIdConnect>False</ADUsesOwinOrOpenIdConnect>
<PublishProvider>AzureWebSite</PublishProvider>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish>http://ramsoftazurewebappdemo.azurewebsites.net</SiteUrlToLaunchAfterPublish>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<CompileSource>False</CompileSource>
<_DefaultDNXVersion>dnx-clr-win-x86.1.0.0-rc1-update1</_DefaultDNXVersion>
<UsePowerShell>True</UsePowerShell>
<IISCommand>web</IISCommand>
<WebRoot>wwwroot</WebRoot>
<WwwRootOut>wwwroot</WwwRootOut>
<IncludeSymbols>False</IncludeSymbols>
<Native>False</Native>
<IgnoreDNXRuntime>False</IgnoreDNXRuntime>
<MSDeployServiceURL>myservername.mydomain.biz:443</MSDeployServiceURL>
<DeployIisAppPath>MyWebAppPath</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<EnableMSDeployBackup>True</EnableMSDeployBackup>
<UserName>$USERNAME</UserName>
<_SavePWD>True</_SavePWD>
<_DestinationType>AzureWebSite</_DestinationType>
</PropertyGroup>
</Project>
-
直接熟悉可用于 MSDEPLOY 的命令行选项可能不会有什么坏处,您可以从该 powershell ps1 脚本调用自己,而不是使用 .pubxml 格式。下面是如何调用 MSDEPLOY.EXE(在您查找文档时也称为 Microsoft Web Deploy V3 online)的示例:
.
"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe"
-source:IisApp='C:\dev\PublishOut\YourWebApp\wwwroot
-dest:IisApp='YourIisAppName',
ComputerName='https://yourcomputername.yourdomain.biz/msdeploy.axd',
UserName='$USERNAME',
Password='secr3t',
IncludeAcls='False',AuthType='Basic'
-verb:sync -enableLink:contentLibExtension
-enableRule:DoNotDeleteRule -retryAttempts:3
-
如果您还没有尝试过,请习惯 vNext dot net utility (dnu) 命令中的
dnu pack
和dnu publish
选项。这就是您将 ASP.NET 源文件与 DNX 运行时副本捆绑在一起的方式,以便它可以在服务器端运行。对我来说,我无法使用 dnu publish 命令,它似乎是一个客户端资源发布阶段,默认情况下依赖于名为 bower 的 node.js (javascript) 工具,我发现我必须手动安装该工具作为 Visual Studio 2015 的asp.net 5 模板依赖于这个工具,但默认情况下似乎没有安装它(也许我在安装 Visual Studio 时错过了一个选项,如果是这种情况,我会更新这个答案)。
随着更多细节的汇集,我将继续完善和扩展此答案。我目前正在关注tutorials,它仅讨论在部署到 azure 或商业 Internet 托管问题时如何执行此操作,我将尝试将它们调整到内部服务器,您还负责配置IIS 服务器以及必须在 IIS 服务器上配置的任何发布代理软件。
【讨论】:
以上是关于如何从 Visual Studio 2015 (+U1) ASP.NET Core 发布到 Windows Server 2012R2 上的 IIS?的主要内容,如果未能解决你的问题,请参考以下文章
从 Visual Studio 2015 企业更新 1 面向 Windows XP
如何下载 Visual Studio Community Edition 2015(不是 2017)
如何从 Visual Studio 2015 更新 3 中的构建中排除 node_module 文件夹
如何从 Visual Studio 2015 (+U1) ASP.NET Core 发布到 Windows Server 2012R2 上的 IIS?