Partager via


L’instance de rôle AssemblyBinder lève l’exception System.IO.IOException

Cet article fournit des informations sur les problèmes de résolution des problèmes dans lesquels l’instance de rôle AssemblyBinder de l’application De compresseur est bloquée entre l’état occupé et le redémarrage et lève l’exception System.IO.IOException indiquant : Il n’y a pas suffisamment d’espace sur le disque.

Version du produit d’origine : service Gestion des API
Numéro de base de connaissances d’origine : 4464907

Note

Reportez-vous à l’article sur la série de résolution des problèmes du service cloud Azure. Il s’agit du deuxième scénario du labo. Vérifiez que vous avez suivi les instructions de configuration du laboratoire pour l’application De compression en fonction de ce qui suit, pour recréer le problème.

Symptômes

L’instance de rôle AssemblyBinder de l’application Compresseur lève l’exception non gérée ci-dessous dans le panneau Portail Azure et bloquée entre l’état Occupé et redémarrage.

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].

Étapes de résolution des problèmes

À partir de la pile des appels d’erreur, cela ressemble à ce WorkerRole qui effectue une opération de décompression ou d’extraction sur la méthode OnStart(), mais elle échoue en raison d’un stockage insuffisant. La prochaine question évidente qui viendra à votre esprit est où exactement WaWorkerHost.exe processus extrait le fichier.

Pour connaître la réponse, utilisez l’outil Process Monitor pour suivre une trace ProcMon et voir ce que vous pouvez trouver.

Capture d’écran de la trace ProcMon dans Process Monitor.

WaWorkerHost.exe processus écrit un fichier dans son répertoire temporaire par défaut, dont la taille maximale est de 100 Mo, ce qui peut devenir complet à un moment donné. Lorsque vous accédez au répertoire RoleTemp, vous pouvez constater que le quota d’espace disque est effectivement épuisé pour ce répertoire.

Capture d’écran du répertoire RoleTemp.

Vous avez peut-être compris la cause du problème, mais que devez-vous faire quand vous manquez d’espace dans l’emplacement RoleTemp ? Voici la réponse.

Par conséquent, vous devez configurer une ressource de stockage locale et pointer les répertoires TEMP et TMP vers le chemin d’accès de la ressource de stockage local, comme ci-dessous :

La déclaration de ressource locale doit avoir été ajoutée au fichier de définition de service pour le rôle AssemblyBinder.

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

Cette modification doit être effectuée dans la méthode RoleEntryPoint.OnStart .

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

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.