#c# #asp.net #.net #asp.net-mvc #.net-assembly
#c# #asp.net #.net #asp.net-mvc #.net-сборка
Вопрос:
ASP.NET Приложение .NET 4.6 MVC4 загружает ненужную сборку, уравнение. System.Data.OracleClient . Oracle не используется.
Зависимости сборки создаются с использованием кода в контроллере
var sb = new StringBuilder();
foreach (Assembly b in AppDomain.CurrentDomain.GetAssemblies())
{
sb.AppendLine(b.FullName);
foreach (AssemblyName an in b.GetReferencedAssemblies())
sb.AppendLine(" " an.Name);
}
Вывод приведен ниже. В соответствии с этой системой.Веб-ссылки на систему.Дизайн и система.Создайте ссылки на System.Data.OracleClient
Приложение MVC запущено на VPS-сервере с ограниченной памятью. Как это исправить, чтобы ненужные сборки не загружались? Мы надеемся, что это освободит некоторую память на сервере VPS.
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib
System.Drawing
System
System.Configuration
System.Core
System.Data
System.Xml
System.DirectoryServices
System.EnterpriseServices
System.Web.RegularExpressions
System.Design
System.Web.ApplicationServices
System.ComponentModel.DataAnnotations
System.DirectoryServices.Protocols
System.Security
System.Runtime.Caching
System.ServiceProcess
System.Web.Services
Microsoft.Build.Utilities.v4.0
Microsoft.Build.Framework
Microsoft.Build.Tasks.v4.0
System.Windows.Forms
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib
System.Configuration
System.Xml
System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib
System
System.Xml
System.Numerics
System.Security
System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
mscorlib
System
System.Configuration
System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib
System
System.Xml
System.Security
System.Core
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib
System
System.Data.SqlXml
System.Configuration
System.Runtime.Caching, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib
System
System.Data
System.Configuration
Microsoft.Build.Utilities.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib
Microsoft.Build.Framework
System
System.Xml
System.Core
...
System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib
System.Configuration
System.Data
System.Transactions
System
System.EnterpriseServices
раздел привязки web.config также не содержит его:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Обновить
Я попытался в соответствии с ответом поместить команду удаления в web.config, но получил ошибку
Также пытался удалить раздел oracle в соответствии с ответом, используя
<configuration>
<configSections>
<section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<remove name="system.data.oracleclient"></remove>
</section>
</configSections>
...
но получил ошибку:
Как это исправить?
Комментарии:
1. щелкните правой кнопкой мыши по ссылке в проекте и нажмите «Удалить», вы ищете какой-то другой вариант?
2. System.Data. На OracleClient не ссылается ни один проект — это решение. Однако вывод, о котором идет речь, показывает, что он загружен stll.
3. есть ли у него ссылка на раздел привязки сборки во время выполнения в web.Config?
4. Нет. Я обновил вопрос и добавил раздел привязки. Я искал решение для word oracle и не нашел ни одного оператора using или прямой ссылки.
5. Мне самому нужно было освежить информацию по этой теме, и я нашел очень полезную ссылку: weblog.west-wind.com/posts/2012/Nov/03 /. … Из статьи кажется, что вам не повезло: ASP.NET будет предварительно загружены все ссылки (даже неиспользуемые), тогда как, например, простое консольное приложение этого не сделает. Если все это правда, то вам, возможно, просто придется с этим смириться.
Ответ №1:
В веб-приложении есть три типа сборок.
- сборки, которые поставляются вместе с библиотеками (dll), которые вы используете
- сборки, являющиеся скомпилированной версией вашего веб-приложения
- сборки, которые являются основными для запуска сайта
Библиотеки
В первом случае вы можете оптимизировать свои библиотеки, удалив все ненужные ссылки непосредственно на проект вашей dll.
Ссылка
Во втором случае для оптимизации вашей веб-страницы и того, что нужно скомпилировать, вам необходимо удалить все ненужные ссылки на код… например, страница обычно имеет эти первые строки
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
и то, что вы там не используете, является серым, вы можете удалить его…
веб-сборки
А теперь сложная часть — сложная, потому что вы должны играть в игру «попытка / неудача». Теперь, что вы можете удалить и откуда.
Сначала, где мне искать, чтобы найти, что нужно удалить … и ответ находится в global web.config на asp.net . В моем случае я захожу в каталог Windows, в моей текущей версии framework, в каталоге config и нахожу web.config
Там я нахожу несколько ключей….
Сначала вы можете удалить ненужные Http-модули для более быстрого конвейера в httpModule
сеансе на web.config
Это то, что я вижу в global web.config
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
<add name="Session" type="System.Web.SessionState.SessionStateModule" />
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />
<add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
<add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" />
<add name="Profile" type="System.Web.Profile.ProfileModule" />
<add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
<add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
и я захожу в web.config в своем приложении, и вот как я удаляю то, что я не использую:
<httpModules>
<remove name="Session" />
<remove name="PassportAuthentication" />
<remove name="AnonymousIdentification" />
</httpModules>
Теперь для вас, если я продолжу сеанс сборок, это то, что я вижу в global web.config:
<compilation>
<assemblies>
<remove assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="mscorlib" />
<add assembly="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.ServiceModel.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.DynamicData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add assembly="*" />
<add assembly="System.Web.WebPages.Deployment, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</assemblies>
как бы то ни было, я копирую / вставляю в свой web.config и помещаю <clear />
в первую строку, затем я начинаю удалять строки, которые, как я ЗНАЮ, моя программа не использует … и будьте осторожны, чтобы сохранить эту строку <add assembly="*" />
, и в конце написано добавить вашу библиотеку из вашего каталога dll.
<assemblies>
<clear />
<add assembly="Microsoft.VisualStudio.Web.PageInspector.Loader, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add assembly="mscorlib" />
<add assembly="Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
....
<add assembly="*" />
</assemblies>
Сделав это и удалив ту, которую вы не используете, удалив и проверив, работает ли ваше приложение по-прежнему, вы можете значительно ограничить используемые сборки.
Я делаю простой тест и, удалив эту строку
<add assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Я считаю, что на этот раз загружены только сборки от 83 до 79. Почему больше одного минуса? потому WorkflowServices
что загружает еще несколько самостоятельно.
Чтобы удалить что-то из раздела конфигурации, снова в вашем web.config вы делаете это как:
<configuration>
<configSections>
<remove name="system.data.oracleclient"></remove>
...
Комментарии:
1.
OracleClient
не в местах, описанных в ответе. По умолчаниюmachine.config
содержит<section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
. Может ли это вызвать загрузку клиента oracle? Как принудительно . NET не загружать его без изменения machine.config вручную на каждом клиентском сервере?2. @Andrus Аналогично, в разделе конфигурации на вашем
web.config
добавьте строку<configSections><remove name="system.data.oracleclient"></remove>...
, чтобы удалить ее3. Это приводит к ошибке
invalid child element 'remove'
. Я обновил вопрос своими попытками его удалить4. Конфигурация Oracle нигде не определена. приведет ли наличие определения раздела Oracle в файле machine.config к System.Data. Загрузка сборки OracleClient?
5. @Andrus То, что я набрал здесь, я сначала тестирую, на моем компьютере по какой-то причине нет ошибки, но она работает. Теперь определение раздела oracle не вызывает никакой загрузки сборки, если вы не используете on web.config эту часть.
Ответ №2:
На моей рабочей станции есть ссылки на Oracle по всему моему machine.config. Я полагаю, что вы найдете там свои ссылки на мошенников.
c:WindowsMicrosoft.NETFrameworkv4.0.30319Configmachine.config
Комментарии:
1. По умолчанию
machine.config
содержит только<section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
. Раздел конфигурации клиента Oracle нигде не определен. Может ли это вызвать загрузку клиента oracle? Как принудительно . NET не загружать его без изменения machine.config вручную на каждом клиентском сервере?