Primero, tenga en cuenta que en Windows Azure, su función de trabajador simplemente se ejecuta dentro de un entorno de Windows 2008 Server (SP2 o R2). Cuando implemente su aplicación, también desplegará su ejecutable C (o lo tomará del almacenamiento de blobs, pero eso es un poco más avanzado). Para saber dónde vive su aplicación en el disco, llame al Environment.GetEnvironmentVariable("RoleRoot")
, que devuelve una ruta. Por lo general, tendrías tu aplicación en una carpeta llamada AppRoot debajo de la raíz del rol. Encontrarías tu ejecutable C allí.
A continuación, querrá que su aplicación escriba sus archivos en el directorio de salida que especifique en la línea de comandos. Puede configurar el almacenamiento en su máquina virtual local con las propiedades de su función. Mira la ficha Almacenamiento local, y configurar un área de almacenamiento local llamado:
Ahora puede obtener la ruta de acceso a la zona de almacenamiento, en el código, y pasarlo como argumento de línea de comandos:
var outputStorage = RoleEnvironment.GetLocalResource("MyLocalStorage");
var outputFile = Path.Combine(outputStorage.RootPath, "myoutput.txt");
var cmdline = String.Format("--output {0}", outputFile);
He aquí un ejemplo de poner en marcha su proceso de myapp.exe, con argumentos de línea de comando:
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();
Normalmente lo haces con CreateNoWindow true, bu t es más fácil de depurar si puede ver la ventana del shell de comandos.
Lo último: Una vez que su aplicación se lleva a cabo la creación del archivo, usted querrá ya sea:
- procesarlo y eliminarlo (que no está en un lugar duradero por lo que finalmente va a desaparecer)
- Cambie su almacenamiento de utilizar una unidad de nube (almacenamiento duradero)
- Copie su archivo en una burbuja (almacenamiento duradero)
En la producción, tendrá que añadir control de excepciones, y puede volver a ruta stdout y stderr para ser capturado. Pero este código de muestra debería ser suficiente para comenzar.
OOPS - una más 'una cosa más': cuando agregue su 'myapp.exe' a su proyecto, asegúrese de ir a sus Propiedades, y establezca 'Copiar en el directorio de salida' a 'Copiar siempre' - de lo contrario su El archivo myapp.exe no terminará en Windows Azure y se preguntará por qué las cosas no funcionan.
EDIT: Empujar los resultados a un blob - un ejemplo rápido
En primer lugar ponerse en marcha una cuenta de almacenamiento y añadir a la configuración del papel. Digamos que llamó 'AzureStorage' - ahora configurarlo en el código, obtener una referencia a un contenedor de blob, obtener una referencia a una burbuja dentro de ese recipiente, y luego realizar una carga de archivos a la burbuja:
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);
Gracias. ¿También puede explicarme cómo recopilar los archivos creados desde el almacenamiento local? Cada trabajador puede copiar el archivo creado a un blob. Entonces, algún otro rol de trabajador o una aplicación de cliente puede alcanzar ese bloque, ¿verdad? –
Consulte la respuesta actualizada para ver un ejemplo rápido de cómo empujar el archivo de salida a un blob. De nuevo, necesitará manejo de excepciones, etc. Recomiendo descargar el Kit de capacitación de la plataforma Windows Azure para obtener más detalles: excelentes tutoriales y laboratorios prácticos allí. –
esta es una gran respuesta y aprendí mucho de este hilo; pero el único problema al que me enfrento actualmente es crear el archivo de salida. en la respuesta de David, se supone que un indicador "--output" para especificar el archivo de salida. ¿Qué pasa si no hay una bandera? hay una alternativa de usar process.standardoutput también para obtener la salida como una secuencia, pero prefiero usar los operadores de redirección de salida del comando ">", ">>", etc., si es posible. entonces la pregunta es: ** ¿está usando el operador de cmd? ** gracias por la información adicional. – alien052002