我有一个运行在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
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网络应用程序中添加了以下代码:
更改了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
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;
}
}
那就是它。每次运行Web作业时,它都会生成一个随机数并将其插入到Activity表中。运行Web应用程序时,它只会列出添加到主页底部表格中的所有数字(即索引)。
如果你想尝试重现它,你需要做的就是将它添加到BitBucket(或其他git存储库 - 不确定它是否特定于BitBucket),确保链接你的项目以进行持续部署,进行更改,提交并上传您的更改。这是我失败的部分。
如果你在VS中使用WebDeploy,它就会起作用。
别忘了,您必须在两个项目的appSettings部分添加StorageConnectionString
,并将其设置为相关的Azure存储。
感谢。
答案 0 :(得分:1)
您是否计划将应用程序部署到云服务?如果是这样,使用RuntimeEnvironment
是有道理的,但是,如果您 要在ConfiguratoinManager
中寻找应用设置,最好只使用{{1}}可从.NET Runtime基础获得。