2016-07-12 31 views
0

我创建使用Microsoft CREST API用下面的代码新的订阅:如何在创建新的Azure订阅后设置贡献者角色?

WebClient client = new WebClient(); 
SATokenFormatReseller SA_Token = GetSAResellerToken(); 
client.Headers[HttpRequestHeader.Accept] = "application/json"; 
client.Headers[HttpRequestHeader.Authorization] = "Bearer " + SA_Token.access_token; 
client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
client.Headers.Add("api-version", ApiVersion); 
client.Headers.Add("x-ms-correlation-id", Guid.NewGuid().ToString()); 
client.Headers.Add("x-ms-tracking-id", Guid.NewGuid().ToString()); 
var reqOrderObj = CreateReqOrderObject(service, mpn); 
var reqOrderJson = JsonConvert.SerializeObject(reqOrderObj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 
string res = client.UploadString("https://api.cp.microsoft.com/" + TenantId + "/orders", "POST", reqOrderJson); 

成功创建订阅,我试图使用管理蔚蓝核心API来设置新的订阅贡献者角色之后,这样:

public bool CreateRoleAssignment(string subscriptionId, string tenantId, string principalId) 
{ 
    bool roleGranted = false; 
    var azureToken = GetAzureAuthTokenForCustomerTenant(NativeClientId, PartnerCenterUser, PartnerCenterPassword, tenantId); 
    string responseContent = String.Empty; 
    var roleAssignmentId = Guid.NewGuid().ToString(); 
    var correlationId = Guid.NewGuid().ToString(); 
    var request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/{0}/providers/Microsoft.Authorization/roleAssignments/{1}?api-version=2015-07-01", subscriptionId, roleAssignmentId)); 

    request.Method = "PUT"; 
    request.Accept = "application/json"; 
    request.ContentType = "application/json"; 

    request.Headers.Add("x-ms-correlation-id", correlationId); 
    request.Headers.Add("x-ms-tracking-id", Guid.NewGuid().ToString()); 
    request.Headers.Add("Authorization", "Bearer " + azureToken.AccessToken); 

    string content = Json.Encode(CreateRoleAssignmentRequestData(subscriptionId, principalId)); 

    using (var writer = new StreamWriter(request.GetRequestStream())) 
    { 
     writer.Write(content); 
    } 

    try 
    { 
     var response = request.GetResponse(); 
     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      responseContent = reader.ReadToEnd(); 
      roleGranted = true; 
     } 
    } 
    catch (WebException webException) 
    { 
     using (var reader = new StreamReader(webException.Response.GetResponseStream())) 
     { 
      responseContent = reader.ReadToEnd(); 
      roleGranted = false; 
     } 
    } 

    return roleGranted; 
} 

但是,回应是订阅不存在。

经过一段时间后,如果我运行同一段代码(CreateRoleAssignment),则该角色将成功提供给订阅。

如何在创建订阅后实现此过程?

+0

难道是因为订阅变得活跃需要一些时间吗?当我注册一个新的订阅时,我被告知可能需要长达30分钟才能激活订阅。 –

+0

准确地说,我不知道这是个问题,但我该如何处理这种情况,我应该有一个解决方案progammaticaly?某种异步轮询或并行任务可能是? –

+0

我会说继续异步投票。 –

回答

1

正如@GauravMantri所说,使用异步轮询作为下面的示例代码。

var azureToken = GetAzureAuthTokenForCustomerTenant(NativeClientId, PartnerCenterUser, PartnerCenterPassword, tenantId); 
string responseContent = String.Empty; 
var roleAssignmentId = Guid.NewGuid().ToString(); 
var correlationId = Guid.NewGuid().ToString(); 
string url = string.Format("https://management.azure.com/subscriptions/{0}/providers/Microsoft.Authorization/roleAssignments/{1}?api-version=2015-07-01", subscriptionId, roleAssignmentId); 
string content = Json.Encode(CreateRoleAssignmentRequestData(subscriptionId, principalId)); 

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Clear(); 
    client.DefaultRequestHeaders.Add("Accept", "application/json"); 
    client.DefaultRequestHeaders.Add("Content-Type", "application/json"); 
    client.DefaultRequestHeaders.Add("x-ms-correlation-id", correlationId); 
    client.DefaultRequestHeaders.Add("x-ms-tracking-id", Guid.NewGuid().ToString()); 
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + azureToken.AccessToken); 
    var response = await client.PutAsync(url, content); 
    while(!response.IsSuccessStatusCode) 
    { 
     response = await client.PutAsync(url, content); 
    } 
    Console.WriteLine(response.Content.ReadAsStringAsync().Result); 
}