Me encuentro con un problema donde mi implementación se repite a través de Reciclaje. De Visual Studio:¿Captura una excepción en el método onStart de una función de trabajador de Azure?
"Instancias de roles recicladas durante una cierta cantidad de veces durante una operación de actualización o actualización. Esto indica que la nueva versión de su servicio o la configuración que proporcionó al configurar el servicio impiden la ejecución de instancias de roles. La razón más probable es que el código arroje una excepción no controlada. Considere la posibilidad de reparar el servicio o cambiar las configuraciones para que las instancias de roles no emitan excepciones no controladas. Luego, inicie otra actualización o actualización. Hasta que inicie otra actualización o actualización operación, Windows Azure continuará intentando actualizar su servicio a la nueva versión o configuración que proporcionó "
Mi pregunta: ¿Cuál es la mejor forma de detectar la excepción? Soy un poco nuevo para C#. Una versión condensada de mi onStart en caso de que ayuda:
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("WorkerRole1 entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// Retrieve storage account from Connection String
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create blob client
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// retrieve reference to container (blob resides within container)
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
// create container if it doesn't already exist
container.CreateIfNotExist();
// make container public *temp*
container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
// Retrieve references to required blobs
CloudBlob batch = container.GetBlobReference("batch.bat");
// Download batch file
using (var fileStream = System.IO.File.OpenWrite(@"C:\batch.bat"))
{
zip.DownloadToStream(fileStream);
}
// run batch file
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "C:\\batch.bat";
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit();
return base.OnStart();
}
}
}
También en caso de que ayuda, aquí es el seguimiento de la pila de RDP:
Stack:
at System.IO.__Error.WinIOError(Int32, System.String)
at System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean, Boolean)
at System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions, System.String, Boolean)
at System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare)
at System.IO.File.OpenWrite(System.String)
at WorkerRole1.WorkerRole.OnStart()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleType)
at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge.<InitializeRole>b__0()
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()
No es una respuesta exacta a su pregunta, pero su código está intentando acceder a c: debe reemplazar dicho acceso con Almacenamiento Local: [enlace] (http://msdn.microsoft.com/en-us/library/ windowsazure/ee758708.aspx). Un ejemplo: [enlace] (http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.serviceruntime.localresource.aspx) – RichBower
Gracias Rich! Eso resolvió el problema :) – RobVious