如何通过Azure Service Management REST API管理Azure服务

时间:2021-12-17 10:54:38

通过本文你将了解:

什么是Azure Service Management REST API

如何获取微软Azure 订阅号

如何获取Azure管理证书

如何调用Azure Service Management REST API

什么是Azure Service Management REST API

Azure Service Management REST API(之后简称为Azure REST API)是微软开放的一组REST API,它使得Azure用户不仅可以从Azure门户网站上对运行在Azure上的服务进行管理,同时也可以通过自己或其他第三方的程序来对Azure上的服务进行管理。

基于REST服务的REST API有一个最大的好处就是它是使用HTTP请求进行调用的,这样使得你可以用各种各样的开发语言和开发工具来开发基于Azure服务管理的服务及应用。(包括微软的Azure PowerShell也是基于该API进行开发的)。

所有Azure REST API 都是通过SSL加密的,调用的时候需要用过X.509 v3证书来进行交互认证的。

在调用Azure REST API的时候,至少有两个信息是必须具备的。

1.微软Azure订阅号。

2.存在于Azure 证书管理服务中的X.509 V3证书。

如何获取微软Azure 订阅号

微软Azure订阅号(Subscription ID)就是微软Azure中用来识别用户身份的用户名。它是一串ID,每个对Azure REST API的调用都会在URL内包含这个ID。Azure REST API就是通过这种方式识别用户身份的。

获取这个ID的方式也十分简单:

1.登录Azure门户

2.在左边目录栏中找到设置选项点击打开

3.在右边找到账户对应的subscription id,这就是Azure的订阅号了,在调用Auzre REST API的时候会用到。

如何获取Azure管理证书

Azure 管理证书是一个用于验证代理(如 Visual Studio Tools for Windows Azure 或使用服务管理 API 的客户端应用程序)的 X.509 v3 证书,从而代表订阅所有者管理订阅资源。Azure 管理证书将上载到 Azure 中并存储在订阅级别。

在调用Azure REST API的时候需要使用一个与Auzre 证书管理器中证书相同的客户端证书,才能够通过验证。

获取这个证书的途径有两种

第一种:本地创建证书并上载到Azure中

这种方法的详细过程请参考 MSDN:

创建并上载 Azure 的证书

在上传完成后,你的Azure管理证书中会存放在本地的机器“个人”证书存储中。

你可以通过这个证书的指纹来找到该证书。

1.打开Azure管理页面

2.在左边目录栏中找到设置选项点击打开

如何通过Azure Service Management REST API管理Azure服务

3.在右边目录选项中找到“管理证书”选项点击打开

如何通过Azure Service Management REST API管理Azure服务

4.通过你上传时输入的名称找到你上传的证书,获取其指纹

如何通过Azure Service Management REST API管理Azure服务

5.在程序中通过指纹来从“个人”证书存储中获取证书对象

在代码中获取证书对象的代码如下:

public static string CertificateThumbprint = "f70dee7fec7364a57c09f09811c7519bc4402c56";//通过上面第四步可以获得指纹的字符串。
public static X509Certificate2 Certificate; X509Store certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certificateStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certs = certificateStore.Certificates.Find(
X509FindType.FindByThumbprint,
CertificateThumbprint,
false); if (certs.Count == 0)
{
Console.WriteLine("Can't find the certificate in your local computer.");
Console.ReadKey();
return;
}
else
{
Certificate = certs[0];
}

  

第二种:通过下载publishsettings 文件的方式获取管理证书

1.通过以下链接下载publishsettings文件(需要登录后方可下载)

https://manage.windowsazure.com/publishsettings/index?client=vs&schemaversion=2.0&whr=azure.com

2.以文本的形式打开该文件,该文件中会附带用户证书名以及Azure管理证书转化成Base64之后的字符串。

如何通过Azure Service Management REST API管理Azure服务

3.将这个证书的base64字符串转化成证书对象。

相关代码如下:

 private const string SettingsFilePath = @"{publish settings file path}";
private const string SubscriptionID = "{Subscription ID}"; private static X509Certificate2 getCertificateBySubscriptionID(string settingsFilePath, string subscriptionID)
{
XElement xElement = XElement.Load(settingsFilePath);
var subscriptionElements = xElement.Descendants("Subscription");
var base64cer = subscriptionElements
.Where(e => e.Attribute("Id").Value.ToString() == subscriptionID)
.FirstOrDefault()
.Attribute("ManagementCertificate").Value.ToString();
return new X509Certificate2(Convert.FromBase64String(base64cer));
}

  

第一种方法是MSDN介绍文档中的方法,但我个人认为第二种方法更加方便,更加简单,因为使用第二种方法,你的程序在其他地方运行时只需要将证书以字符串的形式保存就可以了,而如果用第一种,你需要在其他机器上也将证书导入证书管理器中,这样会非常的麻烦,而且有时还会有一些莫名其妙的错误。

如何调用Azure Service Management REST API

调用API的方式就是利用HttpWebRequest发送HTTP请求

我们可以参考以下示例文档来进行调用。

http://msdn.microsoft.com/zh-cn/library/azure/hh264518.aspx

该实例文档列出了创建一个云存储账号所需要的信息。

在该文档中的请求下面我们可以获取发送请求的URL,以及HTTP请求的方法。

请求标头下面我们可以获取请求必须的标头

注:这里值得注意的是x-ms-version

x-ms-version

必需。指定用于此请求的操作的版本。必须将此标头的值设置为 2011-06-01 或更高版本。有关版本控制标头的更多信息,请参阅服务管理版本控制

这里需要注意的是,由于参考文档的更新不是很快,很有可能Azure 最新的REST API已经不支持老版本的x-ms-version了,建议参阅服务管理版本控制直接取最新的版本。

请求正文例举了一个包含了所有必须与非必须参数请求主体,并且用表格列出了各个参数是否必须,以及他们的功能及作用。

状态代码描述了响应请求返回的状态代码。方便我们在获取响应的时候可以直接判断调用操作是否成功。

最后我们可以在示例代码中找到调用REST API的示例代码。

在这个官方示例中包含了许多使用REST API的技巧方法,总结如下:

一. 如何用程序获取证书对象。(在本文之前已经讲过了,可以用通过下载publishsettings 文件的方式获取管理证书的方式替换

二. 如何创建一个发送HTTP 请求的公共方法。(示例中的 invokeRequest方法)

三. 如何获取一个HTTP请求返回的信息,包括在出现异常的情况下如何获取其返回的错误信息。可以参考(示例中invokeRequest 方法最后一部分的代码)

            try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
// GetResponse throws a WebException for 4XX and 5XX status codes
response = (HttpWebResponse)ex.Response;
} try
{
statusCode = response.StatusCode;
if (response.ContentLength > 0)
{
using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
{
responseBody = XDocument.Load(reader);
}
} if (response.Headers != null)
{
requestId = response.Headers["x-ms-request-id"];
}
}
finally
{
response.Close();
} if (!statusCode.Equals(expectedCode))
{
throw new ApplicationException(string.Format(
"Call to {0} returned an error:{1}Status Code: {2} ({3}):{1}{4}",
uri.ToString(),
Environment.NewLine,
(int)statusCode,
statusCode,
responseBody.ToString(SaveOptions.OmitDuplicateNamespaces)));
} return requestId;

四. 如何获取操作的状态信息(可以参考GetOperationStates方法)

总结:

Azure REST API 优点:

Azure REST API是基于SOA开发的REST服务,开发者可以使用任何支持HTTP协议的开发语言来开发基于该服务的程序。

Azure REST API 缺点:

直接如示例般Azure REST API但是其编程的模式并非如面向对象的编程,所以在调用的时候复用性,和扩展性都不是很强,需要开发者自己去构建对象,来增加扩展性。

(好在,微软的开发人员已经推出了基于REST API的C#类库,来方便.net开发人员用他们熟悉的方式来间接的调用Azure REST API。 详情请参照:

Azure Management API 之 利用 Windows Azure Management Libraries 来控制Azure platform