【发布时间】: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 应用中添加了以下代码:
-
更改 index.cshtml 并在文件底部添加以下内容:
<h1>Table Endpoint:</h1> @Html.Raw(ViewBag.TableEndpoint) <br /> <h1>Azure Results:</h1> @Html.Raw(ViewBag.Result) -
将 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(); } -
我在 Models 文件夹中添加了一个类,即 Activity.cs
public class Activity : TableEntity { public DateTime Date { get; set; } public int Number { get; set; } }
在 web 作业项目中,进行了以下更改:
-
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 } -
我还添加了一个新类,即 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