Udostępnij za pośrednictwem


Wystąpienie roli AssemblyBinder zgłasza wyjątek System.IO.IOException

Ten artykuł zawiera informacje na temat rozwiązywania problemów, w których wystąpienie roli AssemblyBinder aplikacji kompresora jest zablokowane między stanem Zajęty i Ponowne uruchamianie oraz zgłaszanie wyjątku System.IO.IOException z informacją: Brak wystarczającej ilości miejsca na dysku.

Oryginalna wersja produktu: usługa API Management
Oryginalny numer KB: 4464907

Uwaga 16.

Zapoznaj się z artykułem dotyczącym serii rozwiązywania problemów z usługami w chmurze platformy Azure. Jest to drugi scenariusz laboratorium. Upewnij się, że wykonano instrukcje konfiguracji laboratorium dotyczące aplikacji kompresora zgodnie z tym, aby odtworzyć problem.

Symptomy

Wystąpienie roli AssemblyBinder aplikacji kompresora zgłasza poniższy nieobsługiwany wyjątek w bloku witryny Azure Portal i jest zablokowane między stanem Zajęty i Ponowne uruchamianie.

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

Kroki rozwiązywania problemów

Z stosu wywołań błędu wygląda na to, że ten element WorkerRole wykonuje operację rozpakowywania lub wyodrębniania w metodzie OnStart(), ale kończy się niepowodzeniem z powodu niewystarczającej ilości miejsca do magazynowania. Następnym oczywistym pytaniem, które przyjdzie do głowy, jest to, gdzie dokładnie WaWorkerHost.exe proces wyodrębnia plik.

Aby dowiedzieć się więcej na ten temat, użyj narzędzia Monitor przetwarzania , aby pobrać ślad ProcMon i zobaczyć, co można znaleźć.

Zrzut ekranu przedstawiający śledzenie narzędzia ProcMon w monitorze procesów.

WaWorkerHost.exe proces zapisuje jakiś plik w domyślnym katalogu tymczasowym, który ma maksymalny rozmiar 100 MB, co może stać się pełne w pewnym momencie. Po przejściu do katalogu RoleTemp może się okazać, że przydział miejsca na dysku jest rzeczywiście wyczerpany dla tego katalogu.

Zrzut ekranu przedstawiający katalog RoleTemp.

Być może udało Ci się ustalić przyczynę problemu, ale co należy zrobić, gdy zabraknie miejsca w lokalizacji RoleTemp ? Oto odpowiedź.

W związku z tym należy skonfigurować zasób magazynu lokalnego i wskazać katalogi TEMP i TMP na ścieżkę zasobu magazynu lokalnego, jak pokazano poniżej:

Deklaracja zasobu lokalnego musi zostać dodana do pliku definicji usługi dla roli AssemblyBinder.

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

Ta modyfikacja powinna być wykonywana w metodzie RoleEntryPoint.OnStart .

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

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.