销售电话: 1-800-867-1380

创建部署

 

Create Deployment异步操作上载新服务包并在过渡环境或生产环境中创建新部署。

你必须先完成下列任务,然后才能运行此操作:

按如下所示指定 Create Deployment 请求。 将 <subscription-id> 替换为你的订阅 ID,将 <cloudservice-name> 替换为云服务的名称,并且将 <deployment-slot> 替换为 stagingproduction

方法

请求 URI

POST

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

你必须确保向管理服务发出的请求是安全的。 有关其他详细信息,请参阅 进行身份验证服务管理请求

下表介绍请求标头。

请求标头

说明

Content-Type

必需。 将此标头设置为 application/xml

x-ms-version

必需。 指定用于此请求的操作的版本。 应将此标头设置为 01.10.09 或更高版本。 有关版本控制标头的详细信息,请参阅 服务管理版本控制

请求正文的格式如下所示:


<?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> <State>state-of-extension</State> </Extension> </AllRoles> <NamedRoles> <Role> <RoleName>role_name1</RoleName> <Extensions> <Extension> <Id>identifier-of-extension</Id> <State>state-of-extension</State> </Extension> </Extensions> </Role> </NamedRoles> </ExtensionConfiguration> </CreateDeployment>

下表说明了请求正文的元素。

元素名称

说明

名称

必需。 指定部署的名称。

PackageUrl

必需。 指定引用 BLOB 服务中的服务包的位置的 URL。 服务包可位于同一个订阅下的存储帐户中,也可位于任何存储帐户的共享访问签名 (SAS) URI 中。 有关共享访问签名的详细信息,请参阅使用共享访问签名委托访问权限

配置

必需。 指定用于部署的 Base-64 编码的服务配置文件。

Label

必需。 指定已进行 Base-64 编码的用于部署的标识符。 该标识符的长度最长可以为 100 个字符。 建议该标签在说明内唯一。 该标签可用于跟踪用途。

StartDeployment

可选。 指示是否在创建后立即开始部署。 默认值为 false

如果为 false,则仍部署服务模型,但不立即运行代码。 相反,服务处于 Suspended 状态,直到你调用 更新部署状态 并且将状态设置为 Running,此时服务才会启动。 已部署的服务仍会产生费用,即使该服务已挂起。

StartDeployment 元素才可以使用 2010年-04-01 版或更高版本。

TreatWarningsAsError

可选。 指示是否将包验证警告视为错误。 默认值为 false。 如果设置为 true,则在存在针对服务包的验证警告时,Created Deployment 操作将失败。

TreatWarningsAsError 元素才可以使用版本 2011年-04-01 或更高版本。

名称

可选。 指定扩展的部署属性的名称。 每个扩展属性都必须有定义的名称和值。 最多可有 25 个扩展属性的名称/值对。

Name 元素的最大长度为 64 个字符,仅字母数字字符和下划线在 Name 中有效,并且该名称必须以字母开头。

仅在 01.03.12 版或更高版本中才可以使用 Name 元素。

可选。 指定某个扩展的云服务属性的值。 每个扩展属性都必须有定义的名称和值。 最多可有 25 个扩展属性的名称/值对,并且每个扩展属性值的最大长度为 255 个字符。

仅在 01.03.12 版或更高版本中才可以使用 Value 元素。

ExtensionConfiguration

可选。 指定添加到云服务的扩展。 在 Azure 中,进程可作为云服务的扩展运行。 你必须首先通过使用 添加扩展 向云服务添加某一扩展插件,然后才能将该扩展插件添加到部署中。

ExtensionConfiguration 元素才可以使用版本 2013年-03-01 或更高版本。

指定添加到云服务的扩展。

元素名称

说明

AllRoles

可选。 指定应用于部署中所有角色的扩展的列表。

Extension

必需。 指定要部署到云服务中某个角色的扩展。

NamedRoles

可选。 指定应用于部署中指定角色的扩展的列表。

指定要部署到云服务中某个角色的扩展。

元素名称

说明

Id

必需。 指定扩展的标识符。 向云服务添加扩展时,即创建标识符。 可通过使用 列出扩展 来查找已添加到云服务的扩展的标识符。

State

可选。 指定扩展的状态。 该元素仅适用于 JSON 配置扩展。

可能的值有:

  • Enable

  • Disable

  • Uninstall

默认值为 Enable

仅在 2014-06-01 版或更高版本中才可以使用 State 元素。

指定应用于部署中指定角色的扩展的列表。

元素名称

说明

角色

必需。 指定将扩展添加到的特定角色。

RoleName

必需。 指定角色的名称。

Extension

必需。 指定要部署到云服务中某个角色的扩展。

响应包括 HTTP 状态代码和一组响应标头。

此操作成功后返回状态代码 200(正常)。 有关状态代码的信息,请参阅 服务管理状态和错误代码

此操作的响应包括以下标头。 该响应还可能包括其他标准 HTTP 标头。 所有标准标头都符合 HTTP/1.1 协议规范

响应标头

说明

x-ms-request-id

一个值,它唯一地标识对管理服务做出的请求。 对于异步操作,可使用此标头的值调用获取操作状态以确定操作是已完成、已失败还是仍在进行中。

以下控制台应用程序示例演示如何部署应用程序。 请替换以下变量值:

  • Thumbprint – 替换为订阅中的管理证书的指纹

  • SubscriptionId – 替换为从管理门户获取的订阅标识符

  • ServiceName – 替换为已创建云服务的名称

  • DeploymentName – 替换为要用于部署的名称

    System_CAPS_note注意

    可使用列表位置获取合适的位置。

  • PackageName – 替换为 Blob 存储中至数据包文件的路径

  • ConfigFile – 替换为服务配置文件的名称


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)); } } }
显示:
© 2016 Microsoft