Azure云服务包 - 无法在托管的VSTS构建服务器

时间:2017-12-08 15:22:49

标签: azure azure-cloud-services

我在VSTS上使用托管构建代理,以构建和部署Cloud Service。

打包Cloud Service时,cspack.exe会抱怨它无法找到虚拟路径的物理目录。

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

ServiceDefinition.csdef:错误CloudServices079:找不到   物理目录&#39; Z:\ MySiteMedia&#39;用于虚拟路径   网络/媒体/.

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

有解决方法吗?

更新

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

示例:

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

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

经过一番挖掘后,我发现cspack不能像我原先想象的那样工作。添加

<VirtualDirectory>

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

示例:

enter image description here

变为

enter image description here

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

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

2 个答案:

答案 0 :(得分:0)

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

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

  

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

答案 1 :(得分:0)

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

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

  

(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();
        }
    }
}

VirtualDirectories.json:

{
  "media": "Z:\\MySiteMedia"
}
相关问题