Esporta (0) Stampa
Espandi tutto
Questo argomento non è stato ancora valutato - Valuta questo argomento

Creare la distribuzione

Aggiornamento: aprile 2014

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

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

  • Creare una sottoscrizione e ottenere il relativo identificatore. Per ulteriori informazioni sulla creazione di una sottoscrizione Windows Azure, vedere la pagina Benvenuti in Windows Azure. È possibile ottenere l'identificatore di sottoscrizione nella pagina Impostazioni del portale di gestione di Windows Azure.

  • Creare e caricare un certificato di gestione per autorizzare l'operazione. Per ulteriori informazioni, vedere Creare e caricare un certificato di gestione per Windows Azure.

  • Creare un servizio cloud utilizzando la pagina relativa alla creazione di un servizio cloud.

  • Decidere se distribuire l'applicazione nell'ambiente di gestione temporanea o di produzione. Per ulteriori informazioni, vedere la pagina relativa alla definizione di servizio cloud

L'operazione Create Deployment è un'operazione asincrona. Per determinare se il servizio di gestione ha terminato l'elaborazione della richiesta, chiamare Ottenere lo stato delle operazioni. Per ulteriori informazioni sulle operazioni asincrone, vedere Rilevamento delle richieste asincrone di gestione del servizio.

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. Questa operazione utilizza HTTP versione 1.1.

 

Metodo URI della richiesta

POST

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

Nessuno.

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 2009-10-01 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. Gli elementi XML devono essere specificati nell'ordine indicato:


<?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 seguente vengono descritti gli elementi chiave nel corpo della richiesta:

 

Nome elemento Descrizione

Name

Obbligatorio. Specifica il nome della distribuzione.

PackageUrl

Obbligatorio. 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 (API REST).

Configurazione

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

Label

Obbligatorio. 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 del 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 del 2011-04-01 o una versione successiva.

Name

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 2012-03-01 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 2012-03-01 o una versione successiva.

ExtensionConfiguration

Facoltativo. Specifica un'estensione aggiunta al servizio cloud. In Windows Azure un processo può essere eseguito come estensione di un servizio cloud. Ad esempio, Accesso desktop remoto o l'agente Diagnostica Windows Azure possono essere eseguiti come estensioni del 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 del 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

Obbligatorio. 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

Obbligatorio. 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

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

RoleName

Obbligatorio. Specifica il nome del ruolo.

Estensione

Obbligatorio. 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.

Poiché Create Deployment è un'operazione asincrona, è necessario chiamare Ottenere lo stato delle operazioni per determinare se l'operazione è completata, non riuscita o in corso.

Poiché Create Deployment è un'operazione asincrona, restituisce sempre il codice di stato 202 (Accettato). Per determinare il codice di stato per l'operazione dopo che è stata completata, chiamare Ottenere lo stato delle operazioni. Il codice di stato è incorporato nella risposta per questa operazione; se ha esito positivo, sarà 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 lo stato di operazione get con il valore dell'intestazione per determinare se l'operazione è completata, non riuscita o in corso. Per ulteriori informazioni, vedere Rilevamento delle richieste asincrone di gestione del servizio.

Per eseguire l'autenticazione di questa operazione, è possibile utilizzare un qualsiasi certificato di gestione associato alla sottoscrizione specificata da <subscription-id>. Per ulteriori dettagli, vedere Autenticazione di richieste di gestione dei servizi.

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));
    }
  }
}

Il documento è risultato utile?
(1500 caratteri rimanenti)
Grazie per i commenti inviati.
Mostra:
© 2014 Microsoft. Tutti i diritti riservati.