2010-10-25 20 views
0

Partie d'une application Web, nous utilisons un ensemble de contrôle Web interne. Cet assembly contient plusieurs contrôles utilisateur Web dans lesquels plusieurs d'entre eux sont utilisés par d'autres contrôles Web dans le même assembly.ASP.NET charge tous les assemblys dans bin pour rechercher un contrôle utilisateur

L'assembly est construit en tant que site Web avec un projet de déploiement Web.

Les pages de l'application Web principale sont dynamiquement compilées via un service dans un seul ensemble et placées dans le dossier bin approprié. Dans notre serveur de développement, les anciens assemblages ne sont pas toujours rangés et supprimés, ce qui signifie que le dossier est rempli d'anciens assemblages. Lorsque la page qui utilise l'assembly de contrôle Web interne (mentionné ci-dessus) s'exécute, l'instance asp.net génère une insuffisance de mémoire car elle charge tous les anciens assemblys dans le but de déterminer quel assembly contient la référence. le contrôle utilisateur étant utilisé par l'autre contrôle utilisateur à l'intérieur du même assemblage.

Nous utilisons les éléments suivants dans les commandes de l'utilisateur de haut niveau pour enregistrer les autres contrôles

<%@ Register Src="~/....ascx" TagPrefix="UC" TagName="...." %> 

Bien sûr, lorsque l'application fonctionne cela ne donne aucune information à laquelle l'assemblage, il peut le trouver dans.

Y a-t-il quelqu'un qui a déjà rencontré ce problème? Ce n'est pas vraiment un problème car nos serveurs live utilisent un outil de nettoyage pour supprimer les anciens assemblages, mais il y a encore des situations potentielles où nous pourrions perdre de la mémoire (par exemple, l'outil cesse de fonctionner!). agréable de résoudre ce problème.

Merci

Voici la trace de la pile

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.] 
    System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0 
    System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +43 
    System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +127 
    System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +142 
    System.Reflection.Assembly.Load(String assemblyString) +28 
    System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +46 

[ConfigurationErrorsException: Exception of type 'System.OutOfMemoryException' was thrown.] 
    System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +613 
    System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +203 
    System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +105 
    System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +178 
    System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +54 
    System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed) +8812786 
    System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories) +128 
    System.Web.Compilation.BuildManager.CompileCodeDirectories() +265 
    System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +320 

[HttpException (0x80004005): Exception of type 'System.OutOfMemoryException' was thrown.] 
    System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() +58 
    System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +512 
    System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +729 

[HttpException (0x80004005): Exception of type 'System.OutOfMemoryException' was thrown.] 
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +8894095 
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +85 
    System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +259 
+0

Je ne sais pas pour vous mais imaginez que nommer fortement vos assemblées peut résoudre le problème - Au moins, il limiterait ce Assemblages ASP.Net examinera le chargement – Basic

+0

Je sais que c'est une vieille question, mais je suppose que si vous allez utiliser la construction incrémentielle dans ** AssemblyInfo.cs ** en utilisant un * le problème peut disparaître, comme: '[assembly: AssemblyVersion (" 1.0. * ")] [assembly: AssemblyFileVersion (" 1.0 . * ")]' – Amro

Répondre

0

Pour ces cas, je fais l'enregistrement des commandes dans mon web.config.

<pages> 
     <controls> 
      <add tagPrefix="yourPrefix" namespace="Your.Lib.Controls" assembly="Your.Lib.Controls"/> 
     </controls> 
    </pages> 
+0

J'ai ajouté ceci à web.config sans aucun succès. J'ai essayé avec le préfixe de balise utilisé dans la page aspx, et le préfixe de balise utilisé dans les contrôles de l'utilisateur. – Pete