4

我想在 Windows azure 订阅中列出所有管理证书。我尝试使用以下代码。但这给了我一个例外。我可以发现它response是 null 并且异常消息是"The remote server returned an error: (403) Forbidden."

请帮我解决一下这个。Msdn没有为此提供示例:(

using System;
using System.Collections.Generic;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using System.Xml.Linq;

class ManagemenCertificateViewer
{
    public static void Runme()
    {
        string msVersion = "2012-03-01";
        string subscriptionId = "I used the subscription Id here";
        try
        {
            ListManagementCertificates(subscriptionId, msVersion);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception caught: ");
            Console.WriteLine(ex.Message);
        }
    }

    private static void ListManagementCertificates(string subscriptionId, string version)
    {
        string uriFormat = "https://management.core.windows.net/{0}/certificates";
        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.ContentType = "application/xml";

        XDocument responseBody = null;
        HttpStatusCode statusCode;
        HttpWebResponse response;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            // GetResponse throws a WebException for 400 and 500 status codes
            response = (HttpWebResponse)ex.Response;
        }
        statusCode = response.StatusCode;
        if (response.ContentLength > 0)
        {
            using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
            {
                responseBody = XDocument.Load(reader);
            }
        }
        response.Close();
        if (statusCode.Equals(HttpStatusCode.OK))
        {
            XNamespace wa = "http://schemas.microsoft.com/windowsazure";
            XElement storageServices = responseBody.Element(wa + "SubscriptionCertificates");
            int mngmntCertificateCount = 0;
            foreach (XElement storageService in storageServices.Elements(wa + "SubscriptionCertificate"))
            {
                string publicKey = storageService.Element(wa + "SubscriptionCertificatePublicKey").Value;
                string thumbprint = storageService.Element(wa + "SubscriptionCertificateThumbprint").Value;
                string certificateData = storageService.Element(wa + "SubscriptionCertificateData").Value;
                string timeCreated = storageService.Element(wa + "TimeCreated").Value;
                Console.WriteLine(
                    "Certificate[{0}]{1}  SubscriptionCertificatePublicKey: {2}{1}  SubscriptionCertificateThumbprint: {3}{1} certificateData{4}{1} timeCreated{5}{1}",
                    mngmntCertificateCount++, Environment.NewLine, publicKey, thumbprint, certificateData, timeCreated);
            }
        }
        else
        {
            Console.WriteLine("List Management certificates returned an error:");
            Console.WriteLine("Status Code: {0} ({1}):{2}{3}",
                (int)statusCode, statusCode, Environment.NewLine,
                responseBody.ToString(SaveOptions.OmitDuplicateNamespaces));
        }
        return;
    }
}
4

2 回答 2

3

谢谢它按我的预期工作。我只是添加以下行和方法'GetCertificate(arg1)'

request.ClientCertificates.Add(GetCertificate(certThumbprint));

还有一件事,在Msdn帮助指南中,响应正文中有一个标签,称为

<TimeCreated>time-created</TimeCreated>

但是 api 不会响应它刚刚创建的 TimeCreated。

<Created> ..... </Created>
于 2012-10-10T07:33:37.583 回答
1

403 错误表示用于验证服务管理 API 请求的管理证书有问题。我没有看到您在代码中附上管理证书以及您的请求。您可能会发现此链接对验证服务管理 API 请求很有用:http: //msdn.microsoft.com/en-us/library/windowsazure/ee460782

HTH。

于 2012-10-10T05:34:34.687 回答