5

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() 
+1

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

+0

Gracias Rich! Eso resolvió el problema :) – RobVious

Respuesta

Cuestiones relacionadas