Запуск собственного кода на Azure - PullRequest
11 голосов
/ 06 мая 2011

Я пытаюсь запустить исполняемый файл C в Azure.У меня много рабочих ролей, и они постоянно проверяют очередь заданий.Если в очереди есть задание, рабочая роль запускает экземпляр исполняемого файла C как процесс в соответствии с аргументами командной строки, хранящимися в классе задания.Исполняемый файл C обычно создает несколько файлов журнала.Я не знаю, как получить доступ к этим созданным файлам.Какая логика стоит за этим?Где хранятся созданные файлы?Кто-нибудь может мне объяснить?Я новичок в Azure и C #.

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

Ответы [ 2 ]

8 голосов
/ 07 мая 2011

Во-первых, поймите, что в Windows Azure ваша рабочая роль просто выполняется в среде Windows 2008 Server (SP2 или R2).При развертывании приложения вы также развернете свой исполняемый файл C (или получите его из хранилища BLOB-объектов, но это немного сложнее).Чтобы узнать, где находится ваше приложение на диске, вызовите Environment.GetEnvironmentVariable("RoleRoot") - который возвращает путь.Как правило, ваше приложение будет находиться в папке AppRoot в корневом каталоге роли.Там вы найдете свой исполняемый файл C.

Далее вы захотите, чтобы ваше приложение записало свои файлы в выходной каталог, указанный в командной строке.Вы можете настроить хранилище в своей локальной виртуальной машине с помощью свойств вашей роли.Посмотрите на вкладку Локальное хранилище и настройте именованную локальную область хранения:

enter image description here

Теперь вы можете получить путь к этой области хранения в коде и передать его в виде командыСтроковый аргумент:

var outputStorage = RoleEnvironment.GetLocalResource("MyLocalStorage");
var outputFile = Path.Combine(outputStorage.RootPath, "myoutput.txt");
var cmdline = String.Format("--output {0}", outputFile);

Вот пример запуска процесса myapp.exe с аргументами командной строки:

var appRoot = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot")
            + @"\", @"approot");

var myProcess = new Process()
{
   StartInfo = new ProcessStartInfo(Path.Combine(appRoot, @"myapp.exe"), cmdline)
   {
      CreateNoWindow = false,
      UseShellExecute = false,
      WorkingDirectory = appRoot
   }
};
myProcess.WaitForExit();

Обычно вы устанавливаете CreateNoWindow в true, но это прощеотладка, если вы видите окно командной оболочки.

Последнее: когда ваше приложение завершит создание файла, вы можете либо:

  • обработать его и удалить его (оно не в надежном месте, поэтому в конечном итоге оно исчезнет)
  • Измените хранилище на использование облачного диска (долговременное хранилище)
  • Скопируйте файл в большой двоичный объект (надежное хранилище)

В процессе работы вы захотите добавить обработку исключений и можете перенаправить stdout и stderr для захвата.Но этого примера кода должно быть достаточно, чтобы начать работу.

OOPS - еще одна «еще одна вещь»: при добавлении «myapp.exe» в ваш проект, ОБЯЗАТЕЛЬНО перейдите к его «Свойствам» и установите«Копировать в выходной каталог» в «Копировать всегда» - иначе ваш файл myapp.exe не окажется в Windows Azure, и вы удивитесь, почему что-то не работает.

РЕДАКТИРОВАТЬ: отправка результатов вblob - быстрый пример

Сначала настройте учетную запись хранения и добавьте в настройки своей роли.Допустим, вы назвали его «AzureStorage» - теперь установите его в коде, получите ссылку на контейнер больших двоичных объектов, получите ссылку на большой двоичный объект в этом контейнере, а затем выполните загрузку файла в большой двоичный объект:

        CloudStorageAccount storageAccount = CloudStorageAccount.FromConfigurationSetting("AzureStorage");
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer outputfiles = blobClient.GetContainerReference("outputfiles");
        outputfiles.CreateIfNotExist();

        var blobname =  "myoutput.txt";
        var blob = outputfiles.GetBlobReference(blobname);
        blob.UploadFile(outputFile);
2 голосов
/ 06 мая 2011

В земле Azure вы не должны писать в файловую систему.Вы должны писать в SQL Azure, Table Storage или, скорее всего, в этом случае хранилище BLOB-объектов (в основном, я думаю, вы должны думать о хранилище BLOB-объектов как о старой файловой системе)

Это потому, что:

  1. Вы можете запустить несколько экземпляров, и у вас будут разные файлы в разных экземплярах (которые являются просто виртуальными машинами)

  2. Ваш экземпляр потенциально может быть перемещен на любоймомент, и вы потеряете информацию о файловой системе, поскольку она не является частью вашего пакета развертывания.

Использование одного из трех вариантов хранения обеспечит центральное хранилище для всех ваших экземпляров, чтобыдоступ, и это будет сохраняться в течение перераспределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...