標籤:des style blog class code c
通過本文你將瞭解:
什麼是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 Cert Manager中認證相同的用戶端認證,才能夠通過驗證。
擷取這個認證的途徑有兩種
第一種:本地建立認證並上傳到Azure中
這種方法的詳細過程請參考 MSDN:
建立並上傳 Azure 的認證
在上傳完成後,你的Azure管理憑證中會存放在本地的機器“個人”憑證存放區中。
你可以通過這個認證的指紋來找到該認證。
1.開啟Azure管理頁面
2.在左邊目錄欄中找到設定選項點擊開啟
3.在右邊目錄選項中找到“管理憑證”選項點擊開啟
4.通過你上傳時輸入的名稱找到你上傳的認證,擷取其指紋
5.在程式中通過指紋來從“個人”憑證存放區中擷取認證對象
在代碼中擷取認證對象的代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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之後的字串。
3.將這個認證的base64字串轉化成認證對象。
相關代碼如下:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
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介紹文檔中的方法,但我個人認為第二種方法更加方便,更加簡單,因為使用第二種方法,你的程式在其他地方運行時只需要將認證以字串的形式儲存就可以了,而如果用第一種,你需要在其他機器上也將認證匯入Cert Manager中,這樣會非常的麻煩,而且有時還會有一些莫名其妙的錯誤。
如何調用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 方法最後一部分的代碼)
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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)