c# - 通过 VS 2015 RC 进行非 Azure 部署

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

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

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

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

Custom publish option

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

最佳答案

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

准备

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

  • 一个指向根应用程序目录并将仅用于部署。我会命名它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 中按“发布”时,您应该会在列表中看到这个新的配置文件。
  • 像往常一样填写“连接”选项卡(设置服务器、站点名称等)。请记住将站点名称设置为部署站点 ( 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再次窗口,并检查 Publish using Powershell script Settings 上的选项标签。
    再试一次。

    ERROR_CERTIFICATE_VALIDATION_FAILED

    如果出现错误:ERROR_CERTIFICATE_VALIDATION_FAILED ,这意味着 IIS Management Service 的 SSL 证书您的计算机不信任您的目标机器上。您可以尝试下载证书并将其添加到受信任的证书存储区,或者您可以完全禁用证书验证。

    在后一种情况下,您需要编辑 publish-module.psm1位于 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)
    

    并添加这个:
    $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服务器 field in Publish profile连接 tab to:我的主机: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\1.0.0-pre\publish-module.psm1并找到这一行:
    $publishArgs += '-enableLink:contentLibExtension'
    

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

    仅部署 wwwroot 目录的内容

    现在您的网站正在部署,还有一件事。我们想部署 approotwwwroot目录,而只有 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
    

    这会将发布的文件夹设置为 wwwroot 的父文件夹。 ,这正是我们所需要的。在再次发布之前,您可能需要清除您站点在服务器上的目录 - 现在发布的目录结构将有所不同。

    测试

    此时,站点应该已部署并在服务器上可用。在服务器端,您应该看到两个目录:approotwwwroot也许还有一些脚本文件。

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

    关于c# - 通过 VS 2015 RC 进行非 Azure 部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787379/

    相关文章:

    c# - 如何显示重载所选方法的其他方法?

    c# - 什么是最有效的方法 - 检查标签或 GetComponent

    c# - Azure - C# 并发 - 最佳实践

    asp.net-mvc - asp.net mvc 并检查用户是否已登录

    asp.net - 重定向到发布方法/操作

    c# - 不要移动到新创建的方法/类/接口(interface)

    c++ - 如何在 Visual C++ 2008 中查找未使用的属性/方法

    c# - 在 C# 和 DLL 之间传递数组数据(双向)

    C#删除列表中以#开头的元素

    c# - 内容文件夹内文件的路径 (ASP.NET MVC)