VENTAS: 1-800-867-1389

Crear implementación

Actualizado: julio de 2014

La operación asincrónica Create Deployment carga un nuevo paquete de servicios y crea una nueva implementación en el entorno de almacenamiento provisional o en el entorno de producción.

Para poder ejecutar esta operación, debe completar las tareas siguientes:

La solicitud Create Deployment se especifica como sigue. Reemplace <subscription-id> por el identificador de la suscripción, <cloudservice-name> por el nombre del servicio en la nube y <deployment-slot> por staging o production.

 

Método URI de solicitud

POST

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

Debe asegurarse de que la solicitud que se realice al servicio de administración sea segura. Para obtener detalles adicionales, vea Autenticar solicitudes de administración del servicio.

Ninguno.

La tabla siguiente describe los encabezados de solicitud.

 

Encabezado de solicitud Descripción

Content-Type

Requerido. Establezca este encabezado en application/xml.

x-ms-version

Requerido. Especifica la versión de la operación que se utiliza para esta solicitud. Este encabezado debería establecerse en 01/10/2009 o posterior. Para obtener más información acerca de los encabezados de control de versiones, vea Control de versiones de la administración del servicio.

El formato del cuerpo de la solicitud es el siguiente:


<?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>

En la tabla siguiente se describen los elementos del cuerpo de la solicitud.

 

Nombre del elemento Descripción

Nombre

Requerido. Especifica el nombre de la implementación.

PackageUrl

Requerido. Especifica una dirección URL que hace referencia a la ubicación del paquete de servicio del servicio Blob. El paquete de servicio puede encontrarse en una cuenta de almacenamiento bajo la misma suscripción o una URI de Firma de acceso compartido (SAS) de cualquier cuenta de almacenamiento. Para obtener más información sobre las Firmas de acceso compartido, vea Delegar el acceso con una firma de acceso compartido.

Configuración

Requerido. Especifica el archivo de configuración del servicio codificado en base 64 para la implementación.

Etiqueta

Requerido. Especifica un identificador codificado en base 64 para la implementación. El identificador puede tener una longitud de hasta 100 caracteres. Se recomienda que la etiqueta sea única dentro de la suscripción. La etiqueta se puede usar con fines de seguimiento.

StartDeployment

Opcional. Indica si iniciar la implementación inmediatamente después de que se crea. El valor predeterminado es false.

Si es false, el modelo de servicio se sigue implementando pero el código no se ejecuta inmediatamente. En su lugar, el servicio está Suspended hasta que se llama a Actualizar estado de implementación y se establece el estado en Running, momento en el que el servicio se inicia. Un servicio implementado tendrá un coste, aunque se suspenda.

El elemento StartDeployment solamente se encuentra disponible si utiliza la versión 01/04/2010 o versiones posteriores.

TreatWarningsAsError

Opcional. Indica si se deben tratar como errores las advertencias de validación de paquetes. El valor predeterminado es false. Si se establece en true, la operación Created Deployment genera un error si hay advertencias de validación en el paquete de servicio.

El elemento TreatWarningsAsError solamente se encuentra disponible si utiliza la versión 01/04/2011 o versiones posteriores.

Nombre

Opcional. Especifica el nombre de una propiedad de implementación extendida. Cada propiedad extendida debe tener tanto un nombre como un valor definidos. Puede tener un máximo de 25 pares de valores y nombres de propiedad extendidos.

La longitud máxima del elemento Nombre es de 64 caracteres, solo los caracteres alfanuméricos y caracteres de subrayado son válidos en el Nombre y debe comenzar por una letra.

El elemento Name solamente se encuentra disponible si utiliza la versión 2012-03-01 o versiones posteriores.

Valor

Opcional. Especifica el valor de una propiedad de servicio en la nube extendida. Cada propiedad extendida debe tener tanto un nombre como un valor definidos. Puede tener un máximo de 25 pares de valores y nombres de propiedad extendidos, y cada valor de propiedad extendido tiene una longitud máxima de 255 caracteres.

El elemento Value solamente se encuentra disponible si utiliza la versión 2012-03-01 o versiones posteriores.

ExtensionConfiguration

Opcional. Especifica una extensión que se agrega al servicio en la nube. En Windows Azure, un proceso puede ejecutarse como una extensión de un servicio en la nube. Debe agregar una extensión al servicio en la nube usando Agregar extensión antes de poder agregarla a la implementación.

El elemento ExtensionConfiguration solamente se encuentra disponible si utiliza la versión 01/03/2013 o versiones posteriores.

Especifica una extensión que se agrega al servicio en la nube.

 

Nombre del elemento Descripción

AllRoles

Opcional. Especifica una lista de extensiones que se aplican a todos los roles en una implementación.

Extension

Requerido. Especifica una extensión que debe implementarse en un rol en un servicio en la nube.

NamedRoles

Opcional. Especifica una lista de extensiones que se aplican a todos los roles especificados en una implementación.

Especifica una extensión que debe implementarse en un rol en un servicio en la nube.

 

Nombre del elemento Descripción

Id

Requerido. Especifica el identificador de la extensión. Se crea el identificador cuando la extensión se agrega al servicio en la nube. Con Enumerar extensiones puede encontrar el identificador de una extensión que se ha agregado a un servicio en la nube.

Especifica una lista de extensiones que se aplican a todos los roles especificados en una implementación.

 

Nombre del elemento Descripción

Rol

Requerido. Especifica un rol específico al que se agrega la extensión.

RoleName

Requerido. Especifica el nombre del rol.

Extension

Requerido. Especifica una extensión que debe implementarse en un rol en un servicio en la nube.

La respuesta incluye un código de estado HTTP y un conjunto de encabezados de respuesta.

Una operación correcta devuelve el código de estado 200 (Correcto). Para obtener información acerca de los códigos de estado, vea Estado y códigos de error de administración del servicio.

La respuesta para esta operación incluye los encabezados siguientes. La respuesta también puede incluir otros encabezados HTTP estándar. Todos los encabezados estándar cumplen la especificación del protocolo HTTP/1.1.

 

Encabezado de respuesta Descripción

x-ms-request-id

Valor que identifica de forma exclusiva una solicitud realizada ante el servicio de administración. Para una operación asincrónica, puede llamar a Obtener estado de la operación con el valor del encabezado para determinar si se ha completado la operación, ha generado un error o aún está en curso.

En el ejemplo de aplicación de consola siguiente se muestra cómo implementar una aplicación. Reemplace los valores variables siguientes:

  • Thumbprint – con la huella digital de un certificado de administración de la suscripción

  • SubscriptionId – con el identificador de suscripción que ha obtenido en el Portal de administración

  • ServiceName – con el nombre del servicio en la nube que creó

  • DeploymentName – con el nombre que desea usar para la implementación



    noteNota
    Puede usar List Locations para obtener la ubicación adecuada.

  • PackageName – con la ruta de acceso de almacenamiento de Blob al archivo de paquete

  • ConfigFile – con el nombre del archivo de configuración del servicio


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

¿Te ha resultado útil?
(Caracteres restantes: 1500)
Gracias por sus comentarios
Mostrar:
© 2014 Microsoft