Esporta (0) Stampa
Espandi tutto

Creare la distribuzione

Aggiornamento: luglio 2014

L'operazione asincrona Create Deployment carica un nuovo pacchetto del servizio e crea una nuova distribuzione negli ambienti di gestione temporanea o di produzione.

Prima di poter eseguire questa operazione, è necessario completare le attività seguenti:

La richiesta Create Deployment viene specificata come indicato di seguito. Sostituire <subscription-id> con l'ID sottoscrizione, <cloudservice-name> con il nome del servizio cloud e <deployment-slot> con staging or production.

 

Metodo URI della richiesta

POST

https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>

È necessario verificare che la richiesta effettuata al servizio di gestione sia sicura. Per ulteriori dettagli, vedere Autenticazione di richieste di gestione dei servizi.

Nessuna.

Nella tabella seguente vengono descritte le intestazioni delle richieste.

 

Intestazione della richiesta Descrizione

Content-Type

Obbligatoria. Impostare questa intestazione su application/xml.

x-ms-version

Obbligatoria. Specifica la versione dell'operazione da utilizzare per questa richiesta. Questa intestazione deve essere impostata su 01/10/2009 o una versione successiva. Per ulteriori informazioni sulle intestazioni di controllo delle versioni, vedere Controllo delle versioni di gestione del servizio.

Il formato del corpo della richiesta è il seguente:


<?xml version="1.0" encoding="utf-8"?>
<CreateDeployment xmlns="http://schemas.microsoft.com/windowsazure">
  <Name>deployment-name</Name>
  <PackageUrl>package-url-in-blob-storage</PackageUrl>
  <Label>base64-encoded-deployment-label</Label>
  <Configuration>base64-encoded-configuration-file</Configuration>
  <StartDeployment>start-deployment</StartDeployment>
  <TreatWarningsAsError>prioritize-warnings</TreatWarningsAsError>
  <ExtendedProperties>
    <ExtendedProperty>
      <Name>property-name</Name>
      <Value>property-value</Value>
    </ExtendedProperty>
  </ExtendedProperties>
  <ExtensionConfiguration>
    <AllRoles>
      <Extension>
        <Id>identifier-of-extension</Id>
      </Extension>
    </AllRoles>
    <NamedRoles>
      <Role>
        <RoleName>role_name1</RoleName>
        <Extensions>
          <Extension>
            <Id>identifier-of-extension</Id>
          </Extension>
        </Extensions>
      </Role>
    </NamedRoles>
  </ExtensionConfiguration>
</CreateDeployment>

Nella tabella indicata di seguito vengono descritti gli elementi nel corpo della richiesta.

 

Nome elemento Descrizione

Nome

Obbligatoria. Specifica il nome della distribuzione.

PackageUrl

Obbligatoria. Specifica un URL che fa riferimento alla posizione del pacchetto del servizio nel servizio Blob. Il pacchetto del servizio può trovarsi in un account di archiviazione nella stessa sottoscrizione o un URI della firma di accesso condiviso da qualsiasi account di archiviazione. Per ulteriori informazioni sulle firme di accesso condiviso, vedere Delega dell'accesso con una firma di accesso condiviso.

Configurazione

Obbligatoria. Specifica il file di configurazione del servizio con codifica Base 64 per la distribuzione.

Label

Obbligatoria. Specifica un identificatore per la distribuzione con codifica Base 64. L'identificatore può contenere un massimo di 100 caratteri. È consigliabile utilizzare un'etichetta univoca all'interno della sottoscrizione. L'etichetta può essere utilizzata per motivi di rilevamento.

StartDeployment

Facoltativo. Indica se avviare immediatamente la distribuzione appena creata. Il valore predefinito è false.

Se false, il modello del servizio viene ancora distribuito, ma il codice non viene eseguito immediatamente. Al contrario, il servizio è Suspended fino a quando si chiama Aggiornare lo stato della distribuzione e si imposta lo stato su Running. Il servizio verrà quindi avviato. Un servizio distribuito comporta comunque addebiti, anche se è sospeso.

L'elemento StartDeployment è disponibile solo se si utilizza la versione 01/04/2010 o una versione successiva.

TreatWarningsAsError

Facoltativo. Indica se considerare gli avvisi di convalida del pacchetto come errori. Il valore predefinito è false. Se è impostato su true, l'operazione Created Deployment ha esito negativo in presenza di avvisi di convalida del pacchetto del servizio.

L'elemento TreatWarningsAsError è disponibile solo se si utilizza la versione 01/04/2011 o una versione successiva.

Nome

Facoltativo. Specifica il nome di una proprietà di distribuzione estesa. Ogni proprietà estesa deve contenere un nome e un valore definiti. È possibile avere un massimo di 25 coppie nome/valore per le proprietà estese.

La lunghezza massima dell'elemento Name è di 64 caratteri. Nel nome sono validi solo i caratteri alfanumerici e i caratteri di sottolineatura. Il nome deve iniziare con una lettera.

L'elemento Name è disponibile solo se si utilizza la versione 01/03/2012 o una versione successiva.

Valore

Facoltativo. Specifica il valore di una proprietà estesa del servizio cloud. Ogni proprietà estesa deve contenere un nome e un valore definiti. È possibile avere un massimo di 25 coppie nome/valore per le proprietà estese e il valore di ciascuna proprietà contiene un massimo di 255 caratteri.

L'elemento Value è disponibile solo se si utilizza la versione 01/03/2012 o una versione successiva.

ExtensionConfiguration

Facoltativo. Specifica un'estensione aggiunta al servizio cloud. In Azure un processo può essere eseguito come estensione di un servizio cloud. È necessario aggiungere un'estensione al servizio cloud utilizzando Aggiungere un'estensione prima di poterla aggiungere alla distribuzione.

L'elemento ExtensionConfiguration è disponibile solo se si utilizza la versione 01/03/2013 o una versione successiva.

Specifica un'estensione aggiunta al servizio cloud.

 

Nome elemento Descrizione

AllRoles

Facoltativo. Specifica un elenco di estensioni applicate a tutti i ruoli in una distribuzione.

Estensione

Obbligatoria. Specifica un'estensione che deve essere distribuita in un ruolo in un servizio cloud.

NamedRoles

Facoltativo. Specifica un elenco di estensioni applicate a ruoli specifici in una distribuzione.

Specifica un'estensione che deve essere distribuita in un ruolo in un servizio cloud.

 

Nome elemento Descrizione

Id

Obbligatoria. Specifica l'identificatore dell'estensione. L'identificatore viene creato quando l'estensione viene aggiunta al servizio cloud. È possibile trovare l'identificatore di un'estensione aggiunta a un servizio cloud utilizzando Elencare le estensioni.

Specifica un elenco di estensioni applicate a ruoli specifici in una distribuzione.

 

Nome elemento Descrizione

Ruolo

Obbligatoria. Specifica un determinato ruolo a cui viene aggiunta l'estensione.

RoleName

Obbligatoria. Specifica il nome del ruolo.

Estensione

Obbligatoria. Specifica un'estensione che deve essere distribuita in un ruolo in un servizio cloud.

Nella risposta sono inclusi un codice di stato HTTP e un set di intestazioni per la risposta.

Un'operazione completata correttamente restituisce il codice di stato 200 (OK). Per informazioni sui codici di stato, vedere Codici di stato e di errore relativi alla gestione dei servizi.

Nella risposta per questa operazione sono incluse le intestazioni riportate di seguito; inoltre, possono essere incluse intestazioni HTTP standard aggiuntive. Tutte le intestazioni standard sono conformi alla specifica del protocollo HTTP/1.1.

 

Intestazione della risposta Descrizione

x-ms-request-id

Valore che identifica in modo univoco una richiesta effettuata nel servizio di gestione. Per un'operazione asincrona, è possibile chiamare Ottenere lo stato delle operazioni con il valore dell'intestazione per determinare se l'operazione è stata completata, ha avuto esito negativo o è ancora in corso.

Nell'esempio di applicazione console seguente viene illustrato come distribuire un'applicazione. Sostituire i valori di variabili seguenti:

  • Thumbprint: con l'identificazione digitale di un certificato di gestione nella sottoscrizione

  • SubscriptionId: con l'identificatore di sottoscrizione ottenuto dal portale di gestione

  • ServiceName: con il nome del servizio cloud creato

  • DeploymentName: con il nome che si desidera utilizzare per la distribuzione



    noteNota
    È possibile utilizzare List Locations per ottenere la posizione appropriata.

  • PackageName: con il percorso nell'archiviazione blob del file di pacchetto

  • ConfigFile: con il nome del file di configurazione del servizio


using System;
using System.Collections.Generic;
using System.Xml.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Net;
using System.IO;
using System.Xml;

namespace CreateDeployment
{
  class Program
  {
    private static XNamespace wa = "http://schemas.microsoft.com/windowsazure";
    private const string Thumbprint = "certificate-thumbprint";
    private const string SubscriptionId = "identifier-of-subscription";
    private const string ServiceName = "name-of-cloud-service";
    private const string DeploymentName = "name-of-deployment-name";
    private const string PackageName = "location-of-package";
    private const string ConfigFile = "name-of-configuration-file";
    private const string Version = "2013-08-01";

    static void Main(string[] args)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" +
        "services/hostedservices/{1}/deploymentslots/production";
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId, ServiceName));
      
      // Base-64 encode the label of the deployment   
      byte[] bytes = System.Text.Encoding.UTF8.GetBytes(ServiceName);
      string base64Label = Convert.ToBase64String(bytes);

       // Create the request body
      XDocument requestBody = new XDocument(
      new XDeclaration("1.0", "UTF-8", "no"),
        new XElement(wa + "CreateDeployment",
          new XElement(wa + "Name", DeploymentName),
          new XElement(wa + "PackageUrl", PackageName),
          new XElement(wa + "Label", base64Label),
          new XElement(wa + "Configuration", ConvertFile(ConfigFile)),
          new XElement(wa + "StartDeployment", true)));

       // Submit the request and get the response
      XDocument responseBody;
      HttpWebResponse response = InvokeRequest(uri, "POST", certificate, requestBody, out responseBody);
      string requestId = String.Empty;
      if (response.Headers != null)
      {
        requestId = response.Headers["x-ms-request-id"];
      }

      if (responseBody != null)
      {
        Console.WriteLine(responseBody.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      
      XDocument statusResponse = GetStatus(requestId);
      if (statusResponse != null)
      {
        Console.WriteLine(statusResponse.ToString(SaveOptions.OmitDuplicateNamespaces));
      }
      Console.Write("Press any key to continue:");
      Console.ReadKey();
    }

    //Get the status of the request    
    private static XDocument GetStatus(string requestId)
    {
      // Set the certificate that matches the Thumbprint value.
      X509Certificate2 certificate = GetStoreCertificate(Thumbprint);
      
       // Create the URI for the request
      string uriFormat = "https://management.core.windows.net/{0}/" + "operations/" + requestId;
      Uri uri = new Uri(String.Format(uriFormat, SubscriptionId));
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = "GET";
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

       // Submit the request and get the response
      XDocument responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
        {
          responseBody = XDocument.Load(reader);
        }
      }
      response.Close();
      return responseBody;
    }
        
    // Add the request headers and get the response from the request
    private static HttpWebResponse InvokeRequest(
      Uri uri,
      string method,
      X509Certificate2 certificate,
      XDocument requestBody,
      out XDocument responseBody)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
      request.Method = method;
      request.Headers.Add("x-ms-version", Version);
      request.ClientCertificates.Add(certificate);
      request.ContentType = "application/xml";

      if (requestBody != null)
      {
        using (Stream requestStream = request.GetRequestStream())
        {
          using (StreamWriter streamWriter = new StreamWriter(
            requestStream, System.Text.UTF8Encoding.UTF8))
          {
            requestBody.Save(streamWriter, SaveOptions.DisableFormatting);
          }
        }
      }

      responseBody = null;
      HttpWebResponse response;
      try
      {
        response = (HttpWebResponse)request.GetResponse();
      }
      catch (WebException ex)
      {
        response = (HttpWebResponse)ex.Response;
      }

      XmlReaderSettings settings = new XmlReaderSettings();
      settings.DtdProcessing = DtdProcessing.Ignore;
      if (response.ContentLength > 0)
      {
        using (XmlReader reader = XmlReader.Create(response.GetResponseStream(), settings))
        {
          try
          {
            responseBody = XDocument.Load(reader);
          }
          catch
          {
            responseBody = null;
          }
        }
      }
      response.Close();
      return response;
    }
    
    // Base-64 encode the contents of the service configuration file.
    private static string ConvertFile(string configFileName)
    {
      string fileContents;
      string base64String = "";
      try
      {
        using (StreamReader reader = new StreamReader(
          File.Open(configFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read)))
        {
          fileContents = reader.ReadToEnd();
        }
      }
      catch (System.Exception exp)
      {
        Console.WriteLine(exp.Message);
        return base64String;
      }

      // Convert the binary input into base-64 encoded output. 
      try
      {
        base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(fileContents));
        return base64String;
      }
      catch (System.ArgumentNullException)
      {
        Console.WriteLine("Binary data array is null.");
        return base64String;
      }
    }

    // Gets the certificate matching the thumbprint from the local store.
    // Throws an ArgumentException if a matching certificate is not found.
    private static X509Certificate2 GetStoreCertificate(string thumbprint)
    {
      List<StoreLocation> locations = new List<StoreLocation>
      { 
        StoreLocation.CurrentUser, 
        StoreLocation.LocalMachine
      };

      foreach (var location in locations)
      {
        X509Store store = new X509Store("My", location);
        try
        {
          store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
          X509Certificate2Collection certificates = store.Certificates.Find(
            X509FindType.FindByThumbprint, thumbprint, false);
          if (certificates.Count == 1)
          {
            return certificates[0];
          }
        }
        finally
        {
          store.Close();
        }
      }
      throw new ArgumentException(string.Format(
        "A Certificate with Thumbprint '{0}' could not be located.",
        thumbprint));
    }
  }
}

Mostra:
© 2014 Microsoft