Изменение конфигурации API управления службами Azure - PullRequest
0 голосов
/ 28 февраля 2012

Я студент и пытаюсь создать приложение, которое позволяет пользователю изменять количество экземпляров службы, размещенной в Azure. Это сделано моей загрузкой нового файла конфигурации для сервиса (http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx). Моя проблема в том, что я продолжаю получать сообщение об ошибке «Удаленный сервер возвратил ошибку: (403) Запрещено», когда я пытаюсь получить ответ в приведенном ниже коде. Я предположил, что ошибка должна быть связана с сертификатами но я могу успешно выполнить запросы GET и получить правильный ответ, используя тот же сертификат, который я использую здесь. Любая помощь очень ценится. Новый файл конфигурации.

public void changeConfiguration (строка serviceName, строка deploySlot, string config, string creationName)

    {

        byte[] encodedConfigbyte = new byte[config.Length];
        encodedConfigbyte = System.Text.Encoding.UTF8.GetBytes(config);
        string encodedConfig = Convert.ToBase64String(encodedConfigbyte);

        Uri changeConfigRequestUri = new Uri("https://management.core.windows.net/" + subscriptionId + "/services/hostedservices/" + serviceName + "/deployments/" + deploymentName + "/?comp=config)");

        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(changeConfigRequestUri);

        request.Headers.Add("x-ms-version", "2010-10-28");
        request.Method = "POST";

        string bodyText = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                          "<ChangeConfiguration xmlns=\"http://schemas.microsoft.com/windowsazure" + ">" + "<Configuration>" + encodedConfig + "</Configuration>" + "<TreatWarningsAsError>false</TreatWarningsAsError>" + "<Mode>Auto</Mode>"+"</ChangeConfiguration>";

        byte[] buf = Encoding.UTF8.GetBytes(bodyText);
        request.ContentType = "text/xml";
        request.ContentLength = buf.Length;

        StreamWriter writer = new StreamWriter(request.GetRequestStream());
        var data = Encoding.ASCII.GetBytes(buf.ToString());
        writer.Write(data);
        writer.Flush();
        writer.Close();

        X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
        try
        {
            certStore.Open(OpenFlags.ReadOnly);
        }
        catch (Exception e)
        {
            if (e is CryptographicException)
            {
                Console.WriteLine("Error: The store is unreadable.");
            }
            else if (e is SecurityException)
            {
                Console.WriteLine("Error: You don't have the required permission.");
            }
            else if (e is ArgumentException)
            {
                Console.WriteLine("Error: Invalid values in the store.");
            }
            else
            {
                throw;
            }
        }


        X509Certificate2Collection certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
        certStore.Close();

        if (certCollection.Count == 0)
        {
            throw new Exception("Error: No certificate found containing thumbprint " + thumbprint);
        }

        X509Certificate2 certificate = certCollection[0];
        request.ClientCertificates.Add(certificate);


        //Error occurs in line below
        WebResponse response = (HttpWebResponse)request.GetResponse();
        try
        {
            response = request.GetResponse();
        }
       catch (WebException e)
        {
            string test = e.Message;
        }

1 Ответ

0 голосов
/ 03 апреля 2012

Похоже, ваш тип контента неверен.Это одно из требований для вызова API.

У вас есть:

request.ContentType = "text/xml";

У вас должно быть:

request.ContentType = "application/xml";

Кроме того, есть ли причина, по которой вы 'переустановите вашу x-ms-версию на "2010-10-28" вместо последнего API, который является "2011-08-01";

Ссылка: http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx

РЕДАКТИРОВАТЬ:Я также немного обеспокоен тем, как вы добавляете данные своего тела.Похоже, вы конвертируете свой текст в байтовый массив UTF8, а затем делаете tostring массива байтов и перекодируете его в байтовый массив ascii.Это странно для меня.Вы должны быть в состоянии просто передать вашу строку непосредственно в метод Write (bodyText) StreamWriter.API может не знать, как декодировать данные тела, которые вы отправляете.

Попробуйте что-то вроде этого ...

    request.ContentType = "application/xml";

    using (var writer = new StreamWriter(request.GetRequestStream()))
    {
         writer.Write(bodyText);
    }
...