【问题标题】:Azure Cloud Service Package - Cant find Physical/Virtual Path on hosted VSTS build serverAzure 云服务包 - 在托管的 VSTS 构建服务器上找不到物理/虚拟路径
【发布时间】:2017-12-08 15:22:49
【问题描述】:

我在 VSTS 上使用托管构建代理来构建和部署云服务。

打包云服务时,cspack.exe 报错找不到虚拟路径的物理目录。

....
  <WebRole name="MySite" vmsize="Small">
    <Sites>
      <Site name="Web">
        <VirtualDirectory name="media" physicalDirectory="Z:\MySiteMedia" />
        <Bindings>
....

ServiceDefinition.csdef:错误 CloudServices079:找不到 虚拟路径的物理目录“Z:\MySiteMedia” 网络/媒体/。

物理目录确实不存在于构建服务器上,但它存在于将要部署云服务的服务器上。这是一个 Azure 文件共享。

有解决办法吗?

更新

可以在构建代理上创建一个虚拟驱动器,该驱动器具有所需的驱动器号和文件夹。该驱动器可能指向另一个本地驱动器。例如,Z:\ 可能指向 C:\

例子:

net use Z: \\localhost\c$\MySiteMedia

这解决了构建问题,但是,它并没有解决实际问题。

经过一番挖掘,我发现 cspack 并没有像我最初想象的那样工作。当添加一个

<VirtualDirectory>

对于ServiceDefition,它获取该文件夹的内容并将其打包到cspkg 文件中。然后它会创建一个新文件夹,并将其放置在 siteroot 文件夹中,然后为该新文件夹创建一个虚拟目录。

例子:

变成

这意味着 Z:\ 上的 Azure 文件共享将不会被使用。

解决方法是在角色部署后使用 RoleEntryPoint 创建将虚拟目录添加到 IIS。

【问题讨论】:

    标签: azure azure-cloud-services


    【解决方案1】:

    根据 Azure Docs,此属性定义了内容存在于开发机器(或您的方案中的构建机器)上的目录,而不是文件将放置在生产环境中的目录。

    https://msdn.microsoft.com/en-us/library/azure/gg557553.aspx#Site

    必填。指定开发机器上包含的路径 网站或虚拟目录内容。在计算模拟器中, IIS 配置为从该位置检索内容。什么时候 部署到 Azure,物理目录的内容是 与其他服务一起打包。当服务包 部署到 Azure,IIS 配置了 解压后的内容。

    【讨论】:

    • 感谢您的回答。你是绝对正确的,文档说 - 物理目录必须存在于构建机器上。不幸的是,我并不是要粗鲁,答案并没有提供解决方案。
    【解决方案2】:

    我通过创建一个 RoleEntryPoint 解决了这个问题,它为我的角色运行初始化代码。这发生在部署角色之后。代码可以放在角色本身的任何文件夹中。

    Microsoft.Web.Administration 用于将虚拟目录添加到 IIS。我在 NuGet 中使用 Microsoft.Web.Administration 时遇到了一些问题,因为它引用了一个 CORE 项目,该项目在部署到云服务时会出现运行时异常:

    (System.IO.FileNotFoundException: 无法加载文件或程序集 'System.Runtime, Version=4.1.0.0, Culture=neutral..)

    所以我从 C:\Windows\System32\inetsrv\ 中引用了 Microsoft.Web.Administration.dll - 以获取在开发机器上安装 IIS 所需的 DLL。

    代码将虚拟目录添加到 IIS 上的第一个站点。这对我有用,如果您有多个站点,则需要根据需要对其进行修改。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using Microsoft.Web.Administration;
    using Microsoft.WindowsAzure.ServiceRuntime;
    using Newtonsoft.Json;
    
    namespace MyNamespace.Azure
    {
        public class WebRole : RoleEntryPoint
        {
            public override bool OnStart()
            {
                try
                {
                    // Add initialization code here
                    var serverManager = new ServerManager();
                    var site = serverManager.Sites.First();
                    var application = site.Applications.First();
    
                    Trace.WriteLine($"First site: {site.Name} ");
                    Trace.WriteLine($"First application path for site {site.Name}: {application.Path}");
    
                    var vDirs = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(@"Azure\VirtualDirectories.json"));
    
                    var vDirsToDelete = new List<VirtualDirectory>();
                    foreach (var vDir in vDirs)
                    {
                        var virtualDirectories = application.VirtualDirectories.Where(x => x.Path == vDir.Key).ToList();
                        vDirsToDelete.AddRange(virtualDirectories);
                    }
    
                    if (vDirsToDelete.Any())
                    {
                        foreach (var vDir in vDirsToDelete)
                        {
                            Trace.WriteLine($"Removing existing media virtual directory");
                            application.VirtualDirectories.Remove(vDir);
                        }
                    }
    
                    foreach (var vDir in vDirs)
                    {
                        Trace.WriteLine($"Adding virtual directory. Address: {vDir.Key}, PhysicalPath: {vDir.Value}");
                        application.VirtualDirectories.Add(vDir.Key, vDir.Value);
                    }
    
                    serverManager.CommitChanges();
    
                }
                catch (Exception e)
                {
                    Trace.WriteLine("Exception during OnStart: " + e);
                    // Take other action as needed.
                }
    
                return base.OnStart();
            }
        }
    }
    

    虚拟目录.json:

    {
      "media": "Z:\\MySiteMedia"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-25
      • 2016-09-07
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多