Загрузите загруженный файл cspkg из Azure

Могу ли я загрузить загруженный пакет cspkg из Azure (вместо повторной загрузки нового пакета)?

Сценарий -

Мне нужно добавить файлы на существующий сайт - скажем, изображение.

Я RDP и добавить вручную; тем не менее, Azure воссоздает новый экземпляр и стирает мои файлы, когда мой экземпляр ведет себя так ненормально.

(В идеале я должен хранить их на складе, но вопрос не в этом.)

Спасибо за совет!

3 ответа

Решение

[Абзац ниже неверен]

В настоящее время не существует API или механизма, который мог бы загрузить точно такой же CSPKG непосредственно из портала Windows Azure, который был загружен. Это наверняка является большим требованием пользователя Windows Azure, особенно когда вы теряете свой проект или решение Windows Azure.

[Правка - исправление к вышеприведенному абзацу]

Используя API REST "Получить пакет", вы можете загрузить пакет из определенного развертывания в хранилище блога Azure. Если вы решили написать свое собственное приложение на C# для использования REST API, пример приведен здесь. Если вы не хотите писать API и просто загружаете пакет, используя вызов REST, есть несколько инструментов, и я использовал BURP (на основе Java), как описано в моем блоге здесь. Вы можете использовать информацию в блоге, чтобы настроить соединение с порталом Azure, а затем использовать вызов REST, как описано в документации, для получения пакета.

Далее, даже если вы загружаете CSPKG (или имеете локальную копию CSPKG), вы все равно не можете редактировать его, добавляя или удаляя какой-либо контент непосредственно к нему, потому что это нарушит целостность пакета CSPKG, и вы получите ошибку при его загрузке. Пакет должен быть создан с использованием инструмента CSPACK.

Диск E:\, где находится ваш подход, включает в себя большую часть вашего скомпилированного кода, так что, если вы можете загрузить его локально и предложить идею для создания новой формы проекта, которая (???), это может быть вариантом. Если пакет был создан непосредственно с помощью инструмента CSPACK и загрузка файлов с диска E:\ и воссоздание пакета работает, однако, если в проект сложного приложения включены файлы исходного кода и скомпилированного кода, например приложения ASP.NET/MVCx, это сложно,

Я столкнулся с подобной проблемой,

Что я сделал,

использование Get-Package REST API призывает хранить cspkg а также cscfg файлы в контейнере для хранения.

Помните, что этот контейнер хранения должен находиться в рамках той же подписки, иначе вызовы API REST Get-Package не будут выполнены.

Затем я использовал AzCopy ( http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx), чтобы скопировать файлы из контейнер для хранения моих локальных дисков.

Вы также можете использовать AzCopy для копирования из одного StorageContainer в другой, даже по разным подпискам.

Дайте мне знать, если вам нужно больше деталей.

Используя пакет NuGet библиотеки управления службами Windows Azure, код C# для получения пакета становится:

private static X509Certificate2 GetCertificate(string storeName, string thumbprint)
{
    var store = new X509Store(storeName);
    store.Open(OpenFlags.ReadOnly);
    return store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true)[0];
}

public static void ExportPackage(X509Certificate2 certificate, string subscriptionId, string serviceName, string deploymentName, string containerUri)
{
    var managementService = ServiceManagementHelper.CreateServiceManagementChannel("WindowsAzureEndPoint", certificate);

    try
    {
        managementService.GetPackage(
            subscriptionId,
            serviceName,
            deploymentName,
            containerUri,
            true /*overwriteExisting*/);
    }
    catch (Exception ex)
    {
        System.Net.WebException exception = ex.InnerException as System.Net.WebException;
        if (exception != null)
        {
            string responseText;

            using (var reader = new System.IO.StreamReader(exception.Response.GetResponseStream()))
            {
                responseText = reader.ReadToEnd();
                Console.WriteLine("ERROR:" + exception);
                Console.WriteLine(responseText);
            }
        }
    }
}

Моя проблема, однако, заключается в том, что независимо от того, что я передаю в качестве containerUri, я получаю обратно 400 неверных запросов - Значение параметра'thing.blob.core.windows.net/somecontainer'; указанный для параметра ContainerUriString недействителен.

Обновление: моя проблема была из-за контейнера хранения, принадлежащего другой подписке - это, очевидно, не работало. Я убедился, что контейнер принадлежит той же подписке, и вуаля!

Обновление: этот код предполагает следующее app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="WindowsAzureServiceManagement_WebHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
                <readerQuotas maxStringContentLength="1048576" maxBytesPerRead="131072"/>
                <security mode="Transport">
                    <transport clientCredentialType="Certificate"/>
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <client>
        <endpoint name="WindowsAzureEndPoint" address="https://management.core.windows.net" binding="webHttpBinding" bindingConfiguration="WindowsAzureServiceManagement_WebHttpBinding" contract="Microsoft.Samples.WindowsAzure.ServiceManagement.IServiceManagement" />
    </client>
</system.serviceModel>
</configuration>

или, в качестве альтернативы, для пользователей LinqPad вы можете настроить встроенный веб-сервис следующим образом:

        var b = new WebHttpBinding(WebHttpSecurityMode.Transport);
        b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
        var address = new EndpointAddress("https://management.core.windows.net");
        var managementService = ServiceManagementHelper.CreateServiceManagementChannel(b, address.Uri, certificate);

Типичное использование:

X509Certificate2 certificate = GetCertificate("My", "NNNNNNNNNNNNN");
ExportPackage(certificate,
            "00000000-0000-0000-0000-000000000000",
            "yourservice",
            "00000000000000000000000000000000",
            "https://yourstorage.blob.core.windows.net/container");
Другие вопросы по тегам