通过VS 2015 RC进行非Azure部署

时间:2015-04-22 03:47:51

标签: c# asp.net-mvc visual-studio asp.net-mvc-5 visual-studio-2015

我在VS 2015 Enterprise RC上尝试了ASP.NET 5及其所有新功能。为了确保顺利的端到端部署,我尝试通过VS Publish功能将应用程序部署到非Azure私有服务器。 VS 2015 RC Publish Option

但是,我错过了一个非常重要的功能:能够发布到非Azure服务器。 VS 2015 RC Publish

在早期版本的Visual Studio中(我使用的是VS 2013),自定义选项就在那里。

Custom publish option

我尝试过修改项目属性,但没有尝试如何将我的ASP.NET 5应用程序部署到自定义服务器。有任何想法吗?

1 个答案:

答案 0 :(得分:8)

这是可行的(毕竟,发布到Azure网站也在内部使用WebDeploy),但它现在有点棘手,需要你调整一些东西。 这是你可以做的(对于VS 2015 CTP6):

制备

Asp.net vnext的目录结构与常规的Asp.net应用程序略有不同。这两个主要目录是:approotwwwroot(如果将应用程序部署到本地文件系统,则可以浏览它们)。我们想要部署这两个目录,但IIS网站路径必须指向wwwroot目录。这个问题似乎在Web Deploy 3.6中得到解决,但我会手动处理它。为此,您可以在IIS中创建两个网站/应用程序:

  • 指向根应用程序目录的一个,将仅用于部署。我将其命名为mysite-deploy
  • 将用于实际托管我们网站的一个,并指向wwwroot目录。我将其命名为mysite

部署

  1. 转到YourprojectDir\Properties\PublishProfiles
  2. 创建一个空的pubxml文件(即mysite.pubxml
  3. 将以下内容粘贴到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>
    
    1. 当您在Visual Studio中按“发布”时,您应该会在列表中看到此新配置文件。
    2. 按照通常的方式填写“连接”选项卡(设置“服务器”,“站点名称”等)。请记住将站点名称设置为部署站点(mysite-deploy)。
    3. 验证连接
    4. 尝试预览标签 - 它很可能不起作用,但如果确实如此 - 你就完成了。
    5. 点击发布
    6. 检查Web Publish Activity窗口中的进度。
    7. 可能的错误

      开箱即用,发布可能会失败。现在它变得棘手:)

      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窗口,然后在Publish using Powershell script标签上查看Settings选项。 再试一次。

      ERROR_CERTIFICATE_VALIDATION_FAILED

      如果收到错误:ERROR_CERTIFICATE_VALIDATION_FAILED,则表示您的计算机不信任目标计算机上IIS Management Service的SSL证书。您可以尝试下载证书,将其添加到受信任的证书存储区,也可以完全禁用证书验证。

      在后一种情况下,您需要修改位于publish-module.psm1的{​​{1}}。找到片段:

      C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\1.0.0-pre\publish-module.psm1

      并添加:

              # add excludes
              $sharedArgs.ExtraArgs += (GetInternal-ExcludeFilesArg -publishProperties $publishProperties)
              # add replacements
              $sharedArgs.ExtraArgs += (GetInternal-ReplacementsMSDeployArgs -publishProperties $publishProperties)
      

      ERROR_COULD_NOT_CONNECT_TO_REMOTESVC

      检查正在调用的确切命令行 - 在$sharedArgs.ExtraArgs += '-allowUntrusted' 中应该记录一行,从Web Publish Activity Window开始。寻找Calling msdeploy with the command:。如果如下所示:ComputerName= /msdeploy.axd'ComputerName='https://https://myhost:8172/msdeploy.axd'服务器, then you should change连接field in Publish profile myhost:8172 tab to: https:// . That's because the powershell script automatically adds / msdeploy.axd`。

      ERROR_PROVIDER_NOT_FOUND

      and

      再次转到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\1.0.0-pre\publish-module.psm1

      这似乎是Web Deploy 3.6的一个功能,但似乎服务器端也必须支持它。要禁用它,只需注释掉这一行。 警告:此更改可能会影响到Azure网站的PowerShell部署

      仅部署wwwroot目录的内容

      现在您的网站已部署,还有一件事。我们希望部署$publishArgs += '-enableLink:contentLibExtension' approot目录,而只部署wwwroot目录的内容。要解决此问题,我们需要再次编辑wwwroot

      找到说:

      的行
      C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\1.0.0-pre\publish-module.psm1

      然后,添加一个新行:

      $webrootOutputFolder = (get-item (Join-Path $packOutput $webroot)).FullName
      

      这会将已发布的文件夹设置为$webrootOutputFolder = $webrootOutputFolder | split-path -parent 的父文件夹,这正是我们所需要的。在再次发布之前,您可能希望清除服务器上的站点目录 - 现在发布的目录结构将不同。

      测试

      此时,应该在服务器上部署并提供该站点。在服务器端,您应该看到两个目录:wwwrootapproot以及一些脚本文件。

      您必须自行调试任何服务器端错误。