Azure - невозможно программно выполнить VIP-своп - PullRequest
2 голосов
/ 11 декабря 2011

Я пытаюсь выполнить операцию развертывания подкачки в C # на размещенной службе, которую я имею в облаке Azure.Мой код не возвращает ошибок, однако своп никогда не выполняется.

Мой код основан на примере кода с веб-сайта Microsoft о том, как выполнить операцию со списком служб, использующую GET, однако при развертывании свопа используется POST.

Я новичок в этом, так что возможно я делаю это совершенно неправильно.Любая помощь приветствуется.

Вот мой код на данный момент:

public void swapDeployment()
{
    string operationName = "hostedservices";

    Uri swapURI = new Uri("https://management.core.windows.net/"
                      + subscriptionId
                      + "/services/"
                      + operationName+"/"
                      +serviceName);

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

    request.Headers.Add("x-ms-version", "2009-10-01");
    request.Method = "POST";
    request.ContentType = "application/xml";

    String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <Swap xmlns=\"http://schemas.microsoft.com/windowsazure\"><Production>HealthMonitor - 21/10/2011 22:36:08</Production><SourceDeployment>SwapTestProject - 13/12/2011 22:23:20</SourceDeployment></Swap>";
    byte[] bytes = Encoding.UTF8.GetBytes(xml);
    request.ContentLength = bytes.Length;



    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 (0 == certCollection.Count)
    {
        throw new Exception("Error: No certificate found containing thumbprint " + thumbprint);
    }

    X509Certificate2 certificate = certCollection[0];

    request.ClientCertificates.Add(certificate);

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(bytes, 0, bytes.Length);
    }

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        if (response.StatusCode != HttpStatusCode.OK)
        {
            string message = String.Format( "POST failed. Received HTTP {0}",response.StatusCode);
            throw new ApplicationException(message);
        }
    }
}


            // Error shown at: using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            // Saying: The remote server returned an error: (404) Not Found.

РЕДАКТИРОВАТЬ: Я думаю, что моей основной проблемой является строка string xml=.Запрашивается имя производства и имя развертывания.Я думал, у меня был только один!Может кто-нибудь уточнить, что я должен здесь вставить ??

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Тело, которое вы отправляете, выглядит неправильно. (В нем отсутствуют элементы <Production> и <SourceDeployment>.) Кроме того, вы не показали используемый вами URL-адрес. 404 может быть из-за неправильного URL. (Я бы ожидал что-то вроде 400 для плохого тела запроса.)

Если вы могли бы поделиться остальной частью кода, это может быть проще для отладки.

0 голосов
/ 11 декабря 2011

На основании документации по развертыванию SWAP (http://msdn.microsoft.com/en-us/library/ee460814.aspx), вам потребуется предоставить тело запроса. Я не видел этого в приведенном выше коде. Можете ли вы попробовать поместить тело запроса и повторить попытку?

...