通过 VS 2015 RC 进行非 Azure 部署
Non-Azure Deployment through VS 2015 RC
我正在尝试 ASP.NET 5 及其在 VS 2015 Enterprise RC 上的所有新功能。为了确保端到端部署顺利,我随后尝试通过 VS 发布功能将应用程序部署到非 Azure 专用服务器。
但是,我错过了一个非常重要的功能:发布到非 Azure 服务器的能力。
在 Visual Studio 的早期版本中(我使用的是 VS 2013),有自定义选项。
我试过修改项目属性,但对如何将我的 ASP.NET 5 应用程序部署到自定义服务器一无所知。有任何想法吗?
这是可行的(毕竟,发布到 Azure 网站也在内部使用 WebDeploy),但现在有点棘手,需要您进行一些调整。
以下是您可以执行的操作(针对 VS 2015 CTP6):
准备
Asp.net vnext 的目录结构与常规 Asp.net 应用程序略有不同。有两个主要目录:approot
和 wwwroot
(如果您将应用程序部署到本地文件系统,您可以浏览它们)。我们想部署这两个目录,但 IIS 网站路径必须指向 wwwroot
目录。这个问题似乎在 Web Deploy 3.6 中得到了解决,但我将手动处理它。为了让它工作,您可以在 IIS 中创建两个 websites/applications:
- 一个指向应用程序根目录的目录,仅用于部署。我将其命名为
mysite-deploy
.
- 一个将用于实际托管我们的网站并将指向
wwwroot
目录。我会简单地命名它 mysite
.
部署
- 转到
YourprojectDir\Properties\PublishProfiles
- 创建一个空的 pubxml 文件(即
mysite.pubxml
)
将以下内容粘贴到您的 pubxml 中:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
</PropertyGroup>
</Project>
- 当您在 Visual Studio 中按 "Publish" 时,您应该会在列表中看到这个新配置文件。
- 像往常一样填写“连接”选项卡(设置服务器、站点名称等)。请记住将站点名称设置为部署站点 (
mysite-deploy
)。
- 验证连接
- 尝试预览选项卡 - 它很可能不起作用,但万一它起作用 - 你就完成了。
- 点击发布
- 在
Web Publish Activity
window中查看进度。
可能的错误
开箱即用,发布可能会失败。现在变得棘手了:)
ERROR_FAILED_TO_DESERIALIZE
起初,我得到的是这个错误:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.AspNet.Publishing.targets(205,5): Error ERROR_FAILED_TO_DESERIALIZE: Web deployment task failed. ()
Publish failed to deploy.
让我们尝试解决这个问题。
再次打开Publish
window,勾选Settings
选项卡上的Publish using Powershell script
选项。
再试一次。
ERROR_CERTIFICATE_VALIDATION_FAILED
如果您收到错误:ERROR_CERTIFICATE_VALIDATION_FAILED
,这意味着您的计算机不信任目标计算机上 IIS Management Service
的 SSL 证书。您可以尝试下载证书并将其添加到受信任的证书存储区,或者您可以完全禁用证书验证。
在后一种情况下,您需要编辑位于 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
的 publish-module.psm1
。找到片段:
# add excludes
$sharedArgs.ExtraArgs += (GetInternal-ExcludeFilesArg -publishProperties $publishProperties)
# add replacements
$sharedArgs.ExtraArgs += (GetInternal-ReplacementsMSDeployArgs -publishProperties $publishProperties)
并添加:
$sharedArgs.ExtraArgs += '-allowUntrusted'
ERROR_COULD_NOT_CONNECT_TO_REMOTESVC
检查被调用的确切命令行 - 在 Web Publish Activity Window
中应该记录一行,从 Calling msdeploy with the command:
开始。寻找 ComputerName=
。如果看起来像这样:ComputerName='https://https://myhost:8172/msdeploy.axd'
/msdeploy.axd', then you should change
Serverfield in Publish profile
Connectiontab to:
myhost:8172. That's because the powershell script automatically adds
https://and
/msdeploy.axd`。
ERROR_PROVIDER_NOT_FOUND
More Information: The provider 'contentPathLib' could not be found. Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_PROVIDER_NOT_FOUND.
再次转到 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
并找到行:
$publishArgs += '-enableLink:contentLibExtension'
这似乎是Web Deploy 3.6的一个特性,但似乎服务器端也必须支持它。要禁用它,只需注释掉这一行。 警告:此更改可能会影响到 Azure 网站的 powershell 部署。
仅部署 wwwroot 目录的内容
现在您的网站正在部署中,还有一件事。我们想部署 approot
和 wwwroot
目录,但只部署了 wwwroot
目录的内容。要解决这个问题,我们需要再次编辑 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
.
找到写着以下内容的行:
$webrootOutputFolder = (get-item (Join-Path $packOutput $webroot)).FullName
然后,添加一个新行:
$webrootOutputFolder = $webrootOutputFolder | split-path -parent
这会将发布的文件夹设置为 wwwroot
的父文件夹,这正是我们所需要的。在再次发布之前,您可能需要清除您网站在服务器上的目录 - 现在发布的目录结构将有所不同。
测试
此时,站点应该已部署并在服务器上可用。在服务器端,您应该看到两个目录:approot
和 wwwroot
以及一些脚本文件。
您必须自己调试任何服务器端错误。
我正在尝试 ASP.NET 5 及其在 VS 2015 Enterprise RC 上的所有新功能。为了确保端到端部署顺利,我随后尝试通过 VS 发布功能将应用程序部署到非 Azure 专用服务器。
但是,我错过了一个非常重要的功能:发布到非 Azure 服务器的能力。
在 Visual Studio 的早期版本中(我使用的是 VS 2013),有自定义选项。
我试过修改项目属性,但对如何将我的 ASP.NET 5 应用程序部署到自定义服务器一无所知。有任何想法吗?
这是可行的(毕竟,发布到 Azure 网站也在内部使用 WebDeploy),但现在有点棘手,需要您进行一些调整。 以下是您可以执行的操作(针对 VS 2015 CTP6):
准备
Asp.net vnext 的目录结构与常规 Asp.net 应用程序略有不同。有两个主要目录:approot
和 wwwroot
(如果您将应用程序部署到本地文件系统,您可以浏览它们)。我们想部署这两个目录,但 IIS 网站路径必须指向 wwwroot
目录。这个问题似乎在 Web Deploy 3.6 中得到了解决,但我将手动处理它。为了让它工作,您可以在 IIS 中创建两个 websites/applications:
- 一个指向应用程序根目录的目录,仅用于部署。我将其命名为
mysite-deploy
. - 一个将用于实际托管我们的网站并将指向
wwwroot
目录。我会简单地命名它mysite
.
部署
- 转到
YourprojectDir\Properties\PublishProfiles
- 创建一个空的 pubxml 文件(即
mysite.pubxml
)
将以下内容粘贴到您的 pubxml 中:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
</PropertyGroup>
</Project>
- 当您在 Visual Studio 中按 "Publish" 时,您应该会在列表中看到这个新配置文件。
- 像往常一样填写“连接”选项卡(设置服务器、站点名称等)。请记住将站点名称设置为部署站点 (
mysite-deploy
)。 - 验证连接
- 尝试预览选项卡 - 它很可能不起作用,但万一它起作用 - 你就完成了。
- 点击发布
- 在
Web Publish Activity
window中查看进度。
可能的错误
开箱即用,发布可能会失败。现在变得棘手了:)
ERROR_FAILED_TO_DESERIALIZE
起初,我得到的是这个错误:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.AspNet.Publishing.targets(205,5): Error ERROR_FAILED_TO_DESERIALIZE: Web deployment task failed. ()
Publish failed to deploy.
让我们尝试解决这个问题。
再次打开Publish
window,勾选Settings
选项卡上的Publish using Powershell script
选项。
再试一次。
ERROR_CERTIFICATE_VALIDATION_FAILED
如果您收到错误:ERROR_CERTIFICATE_VALIDATION_FAILED
,这意味着您的计算机不信任目标计算机上 IIS Management Service
的 SSL 证书。您可以尝试下载证书并将其添加到受信任的证书存储区,或者您可以完全禁用证书验证。
在后一种情况下,您需要编辑位于 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
的 publish-module.psm1
。找到片段:
# add excludes
$sharedArgs.ExtraArgs += (GetInternal-ExcludeFilesArg -publishProperties $publishProperties)
# add replacements
$sharedArgs.ExtraArgs += (GetInternal-ReplacementsMSDeployArgs -publishProperties $publishProperties)
并添加:
$sharedArgs.ExtraArgs += '-allowUntrusted'
ERROR_COULD_NOT_CONNECT_TO_REMOTESVC
检查被调用的确切命令行 - 在 Web Publish Activity Window
中应该记录一行,从 Calling msdeploy with the command:
开始。寻找 ComputerName=
。如果看起来像这样:ComputerName='https://https://myhost:8172/msdeploy.axd'
/msdeploy.axd', then you should change
Serverfield in Publish profile
Connectiontab to:
myhost:8172. That's because the powershell script automatically adds
https://and
/msdeploy.axd`。
ERROR_PROVIDER_NOT_FOUND
More Information: The provider 'contentPathLib' could not be found. Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_PROVIDER_NOT_FOUND.
再次转到 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
并找到行:
$publishArgs += '-enableLink:contentLibExtension'
这似乎是Web Deploy 3.6的一个特性,但似乎服务器端也必须支持它。要禁用它,只需注释掉这一行。 警告:此更改可能会影响到 Azure 网站的 powershell 部署。
仅部署 wwwroot 目录的内容
现在您的网站正在部署中,还有一件事。我们想部署 approot
和 wwwroot
目录,但只部署了 wwwroot
目录的内容。要解决这个问题,我们需要再次编辑 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts.0.0-pre\publish-module.psm1
.
找到写着以下内容的行:
$webrootOutputFolder = (get-item (Join-Path $packOutput $webroot)).FullName
然后,添加一个新行:
$webrootOutputFolder = $webrootOutputFolder | split-path -parent
这会将发布的文件夹设置为 wwwroot
的父文件夹,这正是我们所需要的。在再次发布之前,您可能需要清除您网站在服务器上的目录 - 现在发布的目录结构将有所不同。
测试
此时,站点应该已部署并在服务器上可用。在服务器端,您应该看到两个目录:approot
和 wwwroot
以及一些脚本文件。
您必须自己调试任何服务器端错误。