【问题标题】:Azure AppSettings not transferred with continuous deployment from bitbucketAzure AppSettings 未通过 bitbucket 的持续部署传输
【发布时间】:2015-11-05 05:31:03
【问题描述】:

我有一个运行在 Azure 上的 Web 作业的 Web 应用程序。为了使用持续部署,我已将我的解决方案链接到 Bitbucket,并且该部分工作正常。

我遇到的问题是,每当我进行部署(和重建)时,我的 Web 应用程序或 Web 作业都无法访问我的 Azure 存储表,因为从 CloudConfigurationManager.GetSetting("StorageConnectionString") 返回的值返回一个空白值。

我刚刚通过 FTP 进行了检查,我的 web 应用程序和 webjob 在它们各自的配置文件中都有相关条目,即StorageConnectionString

<appSettings>
    ...
    <add key="StorageConnectionString" 
         value="DefaultEndpointsProtocol=https;
         AccountName=MyASPMVCSite;AccountKey=ABCD==" />
</appSettings>

我调用以下代码从我的appSettings 中读取 StorageConnectionString 值

var cloudStorageAccount = 
CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));

但是当我尝试将此值输出到我的主页或我的网络作业日志时,它“显示”为一个空值。

当我通过Web Deploy 将我的项目直接从 VS 2013 发布到 Azure 时,一切正常。我的StorageConnectionString 值显示在我的主页和网络作业日志上。

有什么想法吗?

谢谢。

更新

如果你有空想尝试重现它,这里是代码。

由于项目很小,但我不认为问题出在代码上。我认为这取决于部署。

我创建了一个基本的 ASP.NET MVC Web 应用程序,然后添加了一个 webjob 项目作为解决方案的第二个项目。这是我从 MS Virtual Academy 关注的一个非常基本的测试样本。它所做的只是在调用 Web 作业时向存储表中插入一个随机数。

我在 ASP.NET MVC Web 应用中添加了以下代码:

  1. 更改 index.cshtml 并在文件底部添加以下内容:

    <h1>Table Endpoint:</h1>
    @Html.Raw(ViewBag.TableEndpoint)
    <br />
    <h1>Azure Results:</h1>
    @Html.Raw(ViewBag.Result)
    
  2. 将 HomeController.cs 更改为:

    public ActionResult Index()
    {
        Time = string.Format("{0:MM/dd/yyyy hh:mm:ss tt}", DateTime.UtcNow);
    
        long ticks = DateTime.MaxValue.Ticks;
        DateTime utcNow = DateTime.UtcNow;
        string orderingTime = string.Format("{0:D19}", ticks - utcNow.Ticks);
    
        ViewBag.Message = "Modify this template to jump-start 
        your ASP.NET MVC application.";
    
        var cloudStorageAccount = CloudStorageAccount.
        Parse(CloudConfigurationManager.
        GetSetting("StorageConnectionString"));
    
        Console.WriteLine(cloudStorageAccount.
        TableEndpoint.ToString());
    
        var tableReference = cloudStorageAccount.
        CreateCloudTableClient().
        GetTableReference("Activity");
    
        var activities = (
            from g in tableReference.CreateQuery<Activity>()
            where (g.PartitionKey == "Demo")
            && string.Compare(g.RowKey, 
            orderingTime, 
            StringComparison.Ordinal) > 0
            select g);
    
        string result = string.Empty;
        if (activities != null)
        {
            foreach (var activity in activities)
            {
                result += string.Format("<p>{0} => {1}</p>", 
                activity.Date.ToLongDateString(), 
                activity.Number.ToString());
            }
        }
    
        ViewBag.TableEndpoint = cloudStorageAccount.TableEndpoint.ToString();
        ViewBag.Result = result;
    
        return View();
    }
    
  3. 我在 Models 文件夹中添加了一个类,即 Activity.cs

    public class Activity : TableEntity
    {
       public DateTime Date { get; set; }
       public int Number { get; set; }
    }
    

在 web 作业项目中,进行了以下更改:

  1. Program.cs 更改为:

    static void Main()
    {
        //var host = new JobHost();
        //// The following code will invoke 
        //a function called ManualTrigger and 
        //// pass in data (value in this case) to the function
        //host.Call(typeof(Functions).
        //GetMethod("ManualTrigger"), new { value = 20 });
    
        var cloudStorageAccount = 
            CloudStorageAccount.Parse(
            CloudConfigurationManager.
            GetSetting("StorageConnectionString"));
    
        Console.WriteLine(
        cloudStorageAccount.TableEndpoint.ToString());
    
        var tableReference = cloudStorageAccount.
            CreateCloudTableClient().
            GetTableReference("Activity");
    
        tableReference.CreateIfNotExists();
    
        Random random = new Random();
    
        var activity = new Activity()
        {
            Number = random.Next(100)
        };
    
        var tableOperation = TableOperation.Insert(activity);
    
        try
        {
            tableReference.Execute(tableOperation);
        }
        catch (Exception)
        {
            throw;
        }
    
      //#if DEBUG
        Console.WriteLine("{0} number generated.", 
        activity.Number.ToString());
        Console.ReadLine();
     //#endif
    }
    
  2. 我还添加了一个新类,即 Activity.cs

    公共类活动:TableEntity { 公共日期时间日期{获取;放; } 公共 int 编号 { 获取;放; }

    public Activity()
    {
        var ticks = DateTime.MaxValue.Ticks;
        var utcNow = DateTime.UtcNow;
    
        this.PartitionKey = "Demo";
        this.RowKey = string.Format("{0:D19}", ticks - utcNow.Ticks);
        this.Date = DateTime.Now;
    }
    

    }

就是这样。每次运行 Web 作业时,它都会生成一个随机数并将其插入到活动表中。运行网络应用程序时,它会简单地列出所有添加到主页底部表格中的数字(即索引)。

如果您想尝试重现它,您需要做的就是将其添加到 BitBucket(或其他 git 存储库 - 不确定它是否特定于 BitBucket),确保链接您的项目以进行持续部署,进行更改,提交并上传您的更改。这是我失败的部分。

如果你随后在 VS 中使用 WebDeploy,它就可以工作。

不要忘记,您必须在两个项目的 appSettings 部分中添加 StorageConnectionString,并将其设置为相关的 Azure 存储。

谢谢。

【问题讨论】:

  • 您能否创建一个最小的解决方案来重现此问题并将其发布到 github 并共享 github 链接?
  • 您好 Zain,感谢您提供帮助。它已经是一个最小的解决方案,因为我刚刚从 MS Virtual Academy 学习 Azure。我构建了一个简单的 asp.net mvc 并向其中添加了非常基本的 Azure 信息,即在表格中添加一个数字,虽然我已经更改了所有连接字符串,但我有点担心在 GitHub 上发布它,因为我不是 100 % 确定我已经删除了所有可能危及我的 Azure 帐户的内容。每次我认为我已经完成时,我都会发现另一个我应该删除的部分,所以正如我所说我有点担心发布这个。

标签: azure azure-storage azure-web-app-service azure-webjobs


【解决方案1】:

您是否有计划将您的应用程序部署到 云服务?如果是这样,使用CloudConfigurationManager 是有意义的,但是,如果您要在RuntimeEnvironment 中查找应用程序设置,最好只使用ConfiguratoinManager,它可以从基础中获得.NET 运行时。

【讨论】:

  • 是的,我们有部署的计划,但为了清楚起见,我只是按照 MS Virtual Academy 的一个例子,这就是他在他的示例中使用的,当他使用 Web Deploy 时,我仍然想了解为什么在提交更改并推送到 Bitbucket 时自动同步时它没有拾取它。
  • 我想我在这里遗漏了一些上下文。你能解释一下哪些应用程序设置没有更新吗?请记住,在 Azure 应用服务中有可以在门户中设置的应用设置。这些设置将覆盖在 ASP.NET 项目的 Web.config 文件中设置的设置。
  • 您好,如果您查看原始帖子的顶部,您会发现我指的是 appSettings,但这并不是说它们没有被转移,因为我可以在web.config,就像在提交时自动部署时 CloudConfigurationManager.GetSetting 没有读取它们,但如前所述,这在使用 VS 的 Web 部署时按预期工作。我已经检查并仔细检查了两个 web.config 都包含这些 appSettings。
  • 只是为了澄清应用程序设置是一个有点过分的术语,我想确保我理解正确。您能否从门户发布经过编辑的部署日志,以便我可以查看在部署期间应用了哪些更改。您可以通过单击门户中的持续部署部分然后单击您遇到问题的特定部署来找到部署日志。
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多