Как избежать загрузки ненужных сборок

#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:

В веб-приложении есть три типа сборок.

  1. сборки, которые поставляются вместе с библиотеками (dll), которые вы используете
  2. сборки, являющиеся скомпилированной версией вашего веб-приложения
  3. сборки, которые являются основными для запуска сайта

Библиотеки

В первом случае вы можете оптимизировать свои библиотеки, удалив все ненужные ссылки непосредственно на проект вашей 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 вручную на каждом клиентском сервере?