Condividi tramite


L'istanza del ruolo AssemblyBinder genera un'eccezione System.IO.IOException

Questo articolo fornisce informazioni sulla risoluzione dei problemi in cui l'istanza del ruolo AssemblyBinder dell'applicazione Compressore è bloccata tra lo stato Occupato e Riavvia e genera un'eccezione System.IO.IOException che indica che non è disponibile spazio sufficiente sul disco.

Versione originale del prodotto: servizio Gestione API
Numero KB originale: 4464907

Note

Vedere l'articolo sulla serie di risoluzione dei problemi dei servizi cloud di Azure, questo è il secondo scenario del lab. Assicurarsi di aver seguito le istruzioni di configurazione del lab per l'applicazione Compressor in base a questa situazione, per ricreare il problema.

Sintomi

L'istanza del ruolo AssemblyBinder dell'applicazione Compressor genera l'eccezione non gestita seguente nel pannello portale di Azure e rimane bloccata tra lo stato Occupato e Riavvia.

Unhandled Exception: There is not enough space on the disk. at System.IO.__Error.WinIOError  (Int32 errorCode, String maybeFullPath) at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count) at Ionic.Zip.ZipEntry.ExtractAndCrc(Stream archiveStream, Stream targetOutput, Int16 compressionMethod, Int64 compressedFileDataSize, Int64 uncompressedSize) at Ionic.Zip.ZipEntry.ExtractToStream(Stream archiveStream, Stream output, EncryptionAlgorithm encryptionAlgorithm, Int32 expectedCrc32) at Ionic.Zip.ZipEntry.InternalExtractToBaseDir(String baseDir, String password, ZipContainer zipContainer, ZipEntrySource zipEntrySource, String fileName) at Ionic.Zip.ZipFile._InternalExtractAll(String path, Boolean overrideExtractExistingProperty) at AssemblyBinder.WorkerRole.OnStart() in D:\compressor\AssemblyBinder\WorkerRole.cs:line 56 at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeRoleInternal(RoleType roleTypeEnum) at Microsoft.WindowsAzure.ServiceRuntime.Implementation.Loader.RoleRuntimeBridge. <InitializeRole> b__0() at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()'[2018-08-12T14:47:25Z] Last exit time: [2018/08/12, 14:47:25.965].

Procedura di risoluzione dei problemi

Dallo stack di chiamate di errore, sembra che questo Ruolo di lavoro stia eseguendo un'operazione di decompressione o estrazione nel metodo OnStart(), ma ha esito negativo a causa di un'archiviazione insufficiente. La domanda ovvia successiva che verrà a mente è dove esattamente WaWorkerHost.exe processo sta estraendo il file.

Per trovare la risposta, usare lo strumento Monitoraggio processi per acquisire una traccia ProcMon e vedere cosa si può trovare.

Screenshot della traccia ProcMon in Monitoraggio processi.

WaWorkerHost.exe processo sta scrivendo un file nella directory temporanea predefinita, con una dimensione massima di 100 MB, che potrebbe diventare piena in un determinato momento. Quando si passa alla directory RoleTemp , è possibile che la quota di spazio su disco sia effettivamente esaurita per tale directory.

Screenshot della directory RoleTemp.

Si potrebbe aver capito la causa del problema, ma cosa è necessario fare quando si esaurisce lo spazio nella posizione RoleTemp ? Ecco la risposta.

È quindi necessario configurare una risorsa di archiviazione locale e puntare le directory TEMP e TMP al percorso della risorsa di archiviazione locale, come illustrato di seguito:

La dichiarazione di risorsa locale deve essere stata aggiunta al file di definizione del servizio per il ruolo AssemblyBinder.

<?xml version="1.0" encoding="UTF-8"?>
<LocalResources>
   <LocalStorage name="FileStorage" cleanOnRoleRecycle="true" sizeInMB="200" />
</LocalResources>

Questa modifica deve essere eseguita nel metodo RoleEntryPoint.OnStart .

localResource = RoleEnvironment.GetLocalResource("FileStorage");
Environment.SetEnvironmentVariable("TMP", localResource.RootPath);
Environment.SetEnvironmentVariable("TEMP", localResource.RootPath);

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.