ASP.NET загружает все сборки в bin, чтобы найти пользовательский элемент управления - PullRequest
0 голосов
/ 25 октября 2010

Часть веб-приложения, которое мы имеем, использует внутреннюю сборку веб-элемента управления. Эта сборка содержит несколько веб-элементов управления, где некоторые из них используются другими веб-элементами управления в одной сборке.

Сборка построена как веб-сайт с проектом веб-развертывания.

Страницы основного веб-приложения динамически компилируются через службу в одну сборку и помещаются в соответствующую папку bin. На нашем сервере разработки старые сборки не всегда приводятся в порядок и удаляются, что означает, что папка заполнена старыми сборками.

Когда запускается страница, которая использует внутреннюю сборку веб-элемента управления (упомянутую выше), экземпляр asp.net выбрасывает нехватку памяти при загрузке всех старых сборок, пытаясь определить, какая сборка содержит ссылку на пользовательский элемент управления используется другим пользовательским элементом управления в той же сборке.

Мы использовали следующие элементы внутри пользовательских элементов управления верхнего уровня, чтобы зарегистрировать другие элементы управления

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

Конечно, когда приложение запускается, оно не дает никакой информации о том, в какой сборке оно может быть найдено.

Кто-нибудь сталкивался с этой проблемой раньше? На самом деле это не проблема, так как наши работающие серверы используют инструмент очистки для удаления старых сборок, но все еще существуют потенциальные ситуации, когда мы можем выйти из памяти из-за этого (например, инструмент перестает работать!), Поэтому было бы хорошо решить эту проблему.

Спасибо

Вот трассировка стека

[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

1 Ответ

0 голосов
/ 25 октября 2010

Для этих случаев я делаю регистрацию элементов управления в моем web.config.

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