Как программно загрузить статический HTML-сайт на веб-сайт Windows Azure?

В настоящее время я создаю локальный генератор статических сайтов на С#. Он собирает кучу шаблонов в иерархию простых старых HTML-файлов. Я хочу загрузить полученные файлы на свой веб-сайт Windows Azure, чтобы изменения отражались в реальном времени, и я хочу иметь возможность делать это программно с помощью моего сценария.

В настоящее время мне приходится загружать сгенерированные файлы вручную с помощью WebMatrix, поскольку я не смог найти API или SDK, которые позволяют мне напрямую загружать HTML на веб-сайт Windows Azure.

Конечно, должен быть способ сделать это из кода, кроме использования библиотеки sFTP (которая, поскольку она не использует протокол WebMatrix/IIS, который, как я думаю, отправляет заархивированные diff-файлы, будет медленным и будет означать выход за рамки допустимого). -синхронизировать данные во время загрузки, в то время как некоторые файлы были обновлены, а другие нет.) Я также предпочел бы не передавать мой сгенерированный сайт в систему управления версиями, если я могу этого избежать. Мне кажется концептуально неправильным помещать что-то в систему управления версиями просто как деталь реализации развертывания.

Обновление: WebMatrix внутренне использует веб-развертывание (MSDeploy). Теоретически вы должны быть в состоянии самостоятельно собрать пакет развертывания с помощью API, но 99% примеров, которые я могу найти, используют инструмент командной строки или инструменты с графическим интерфейсом в Visual Studio. Мне нужно собрать пакет и программно развернуть его из C#. Любые идеи или рекомендации о том, как это сделать? Документы в MSDN на самом деле не показывают никаких примеров для такого сценария.


person Ryan Norbauer    schedule 01.03.2014    source источник


Ответы (4)


Итак, я решил, что делать с помощью пары дружелюбных людей из Microsoft. (См. Ответ Дэвида Эббо на мой вопрос на форуме, а также очень полезная информация от Сайед Хашими показывает, как именно Я хотел сделать из консольного приложения msdeploy.exe).

Просто скачайте файл PublishSettings с веб-портала Azure. Откройте его в текстовом редакторе, чтобы получить значения для вставки в приведенный ниже код.

var destinationOptions = new DeploymentBaseOptions()
{
    // userName from Azure Websites PublishSettings file
    UserName = "$msdeploytest",
    // pw from PublishSettings file
    Password = "ThisIsNotMyPassword",
    // publishUrl from PublishSettings file using https: protocol prefix rather than 443 port
    // and adding "/msdeploy.axd?site={msdeploySite-variable-from-PublishSettings}"
    ComputerName = "https://waws-prod-blu-003.publish.azurewebsites.windows.net/msdeploy.axd?site=msdeploytest",
    AuthenticationType = "Basic"
};
                                                             // This option says we're giving it a directory to deploy
using (var deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.ContentPath,
                                                             // path to root directory of source files 
                                                             @"C:\Users\ryan_000\Downloads\dummysite"))
{
    var syncOptions = new DeploymentSyncOptions();
    syncOptions.WhatIf = false;
                                                                                   // "msdeploySite" variable from PublishSettings file
    var changes = deploymentObject.SyncTo(DeploymentWellKnownProvider.ContentPath, "msdeploytest", destinationOptions, syncOptions);
    Console.WriteLine("BytesCopied:       " + changes.BytesCopied.ToString());
    Console.WriteLine("Added:             " + changes.ObjectsAdded.ToString());
    Console.WriteLine("Updated:           " + changes.ObjectsUpdated.ToString());
    Console.WriteLine("Deleted:           " + changes.ObjectsDeleted.ToString());
    Console.WriteLine("Errors:            " + changes.Errors.ToString());
    Console.WriteLine("Warnings:          " + changes.Warnings.ToString());
    Console.WriteLine("ParametersChanged: " + changes.ParameterChanges.ToString());
    Console.WriteLine("TotalChanges:      " + changes.TotalChanges.ToString());
}

Вы также можете наткнуться на непонятная документация в MSDN. Классы опций со странными именами часто передаются, но если немного прищуриться и порыться в документации, можно увидеть, как параметры командной строки (примеры которых гораздо легче найти в Интернете). ) сопоставляется с вызовами API.

person Ryan Norbauer    schedule 02.03.2014

Вероятно, самый простой способ — настроить публикацию Git. для своего веб-сайта и программно выполните git commit, а затем git push. Вы можете думать об этом как о механизме развертывания вместо системы контроля версий, учитывая, что веб-сайты Azure изначально поддерживают резервный репозиторий Git, который не должен иметь ничего общего с выбранным вами решением SCM.

person Rytmis    schedule 01.03.2014
comment
Возможно, это немного софистика, но вы делаете справедливое замечание. Тем не менее, я бы хотел по возможности избегать использования SCM для развертывания: это потребовало бы перехода к командной строке в моем коде и взаимодействия с Mercurial таким образом, что может привести к путанице. WebDeploy кажется хорошим способом, если только я смогу разобраться в плохо документированном API. - person Ryan Norbauer; 02.03.2014

WebMatrix использует WebDeploy для загрузки файлов на веб-сайты Windows Azure.

person cory-fowler    schedule 01.03.2014
comment
Прохладно. Я изучаю это прямо сейчас, хотя документация и примеры по моему сценарию кажутся скудными. - person Ryan Norbauer; 02.03.2014

В качестве альтернативы можно использовать REST API VFS (https://github.com/projectkudu/kudu/wiki/REST-API#wiki-vfs). диагностическая консоль сегодня использует это для работы с файловой системой.

person Pranav    schedule 03.03.2014
comment
Прохладно. Однако моя идея заключалась в том, что я хотел бы воспользоваться преимуществами технологии, подобной той, что используется в MSDeploy, которая позволяет отправлять заархивированные различия изменений, а не перебирать все файлы по отдельности или слепо загружать их все снова (как при типичном подходе SFTP). ). Похоже, что использование REST API потребует загрузки файлов по отдельности. - person Ryan Norbauer; 03.03.2014