Azure appSettings未通过bitbucket

时间:2015-08-12 14:25:38

标签: azure azure-storage azure-web-sites azure-webjobs

我有一个运行在Azure上运行的Web作业的Web应用程序。我已将我的解决方案与Bitbucket相关联,以便使用持续部署,而且该部分工作正常。

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

我刚刚通过FTP检查过,我的网络应用和webjob都在各自的配置文件中都有相关条目,即StorageConnectionString

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

我调用以下代码来读取appSettings

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

但是当我尝试将此值输出到我的主页或我的webjob日志时,它会显示&#34;作为一个空值。

当我通过Web Deploy直接从VS 2013将项目发布到Azure时,一切都按预期工作。我的StorageConnectionString值显示在我的主页和Web作业日志中。

任何想法为什么?

感谢。

更新

如果您有空闲时间并希望尝试重现它,请输入以下代码。

由于项目规模很小,但我不相信问题在于代码。我认为这取决于部署。

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

我在ASP.NET MVC网络应用程序中添加了以下代码:

  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; }
    }
    
  4. 在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

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

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

      }

    3. 那就是它。每次运行Web作业时,它都会生成一个随机数并将其插入到Activity表中。运行Web应用程序时,它只会列出添加到主页底部表格中的所有数字(即索引)。

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

      如果你在VS中使用WebDeploy,它就会起作用。

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

      感谢。

1 个答案:

答案 0 :(得分:1)

您是否计划将应用程序部署到云服务?如果是这样,使用RuntimeEnvironment是有道理的,但是,如果您 要在ConfiguratoinManager中寻找应用设置,最好只使用{{1}}可从.NET Runtime基础获得。