我目前在Azure SDK for .Net 3.0.2-prerelease中使用基于任务的异步API存在一些并发问题。
我有一个网站名称列表
var webSites = new [] { "website1", "website2" };
从这些,我使用基于任务的API来创建或删除网站。两者偶尔都会失败:
await Task.WhenAll(webSites.Select(x => webSiteClient.WebSites.CreateAsync(
"westeuropewebspace",
new WebSiteCreateParameters
{
SiteMode = WebSiteMode.Limited,
ComputeMode = WebSiteComputeMode.Shared,
Name = x
WebSpaceName = "something"
}
)));
很少,我得到一个例外抱怨服务器场"默认1"已经存在。我知道这个服务器场是为免费网站隐式创建的,但是在创建WebSites之前目前没有办法通过API创建这个服务器场(只有" DefaultServerFarm"可以)。
删除时,会发生类似的事情:
await Task.WhenAll(webSites.Select(x => webSiteClient.WebSites.DeleteAsync(
"westeuropewebspace",
x,
new WebSiteDeleteParameters
{
DeleteAllSlots = true,
DeleteEmptyServerFarm = true,
DeleteMetrics = true,
}
)));
经常(大约每隔一次),我得到一个例外" website2"找不到,虽然它确实存在。但是,网站已被删除。
更新: 我已将第二个Task.WaitAll序列化为foreach循环,但我仍然得到异常。现在唯一的区别是删除" website1"失败了," website2"仍然存在于云中(因为没有发送第二个删除请求),我必须通过门户手动删除它。
答案 0 :(得分:0)
你是对的 - 创建站点api也会尝试隐式创建服务器场,如果同时调用则可能会导致冲突。更安全的方法是使用API显式创建服务器场,然后在创建网站时使用该服务器场。这样,您就可以显式控制站点到服务器场的位置,并且没有隐式服务器场创建。
Azure SDK API包含一种显式创建服务器场的方法。