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

Приложение ASP.NET .NET 4.6 MVC4 загружает ненужную сборку, например. Система.Данные.OracleClient . Оракл не используется.

Зависимости сборки создаются с помощью кода в контроллере

        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.Web ссылается на System.Design, а System.Design ссылается на 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, но получил ошибку

введите описание изображения здесь

Также попытался удалить раздел оракула в соответствии с ответом, используя

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

но получил ошибку:

введите описание изображения здесь

Как это исправить?


person Andrus    schedule 17.10.2016    source источник
comment
Щелкните правой кнопкой мыши ссылку на проект и нажмите «Удалить», чтобы сделать это, вы ищете какой-то другой вариант?   -  person Shiham    schedule 17.10.2016
comment
На System.Data.OracleClient не ссылается ни один проект-решение. Однако рассматриваемый вывод показывает, что он все еще загружен.   -  person Andrus    schedule 17.10.2016
comment
есть ли ссылка на раздел привязки сборки во время выполнения в web.Config?   -  person Shiham    schedule 17.10.2016
comment
Нет. Я обновил вопрос и добавил раздел привязки. Я искал решение для слова oracle и не нашел ни одного оператора использования или прямой ссылки.   -  person Andrus    schedule 17.10.2016
comment
Мне самому нужно было освежить в памяти эту тему, и я нашел очень полезную ссылку: weblog.west-wind.com/posts/2012/Nov/03/. Из статьи кажется, что вам не повезло: ASP.NET предварительно загрузит все ссылки (даже неиспользуемые), тогда как, например. простое консольное приложение не будет. Если все это правда, то, возможно, вам просто придется жить с этим.   -  person Peter B    schedule 17.10.2016
comment
ASP.NET не имеет жестко закодированных ссылок на поставщиков данных. System.Data.OracleClient не следует ссылаться на System.Web, System.Design и подобные сборки. Почему он до сих пор загружается? Может быть, есть какая-то скрытая конфигурация, которая заставляет его загружаться динамически?   -  person Andrus    schedule 17.10.2016
comment
Проверьте наличие экземпляров Oracle в вашем machine.config.   -  person hometoast    schedule 17.10.2016


Ответы (2)


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

  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;

а то, что вы не используете, есть серое, это можно удалить...

веб-сборки

А теперь трудная часть - трудная, потому что вы должны играть в игру "попытка/неудача". Теперь что можно удалить и откуда.

Во-первых, где я ищу, чтобы найти, что удалить... и ответ находится на глобальном web.config на asp.net. В моем случае я иду в каталог windows в моей текущей версии фреймворка, в каталог config и нахожу web.config

Там я нахожу некоторые ключи....

Сначала вы можете удалить ненужные Http-модули для более быстрого конвейера в httpModuleсеансе web.config.

Это то, что я вижу в глобальном 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>

Теперь для вашего случая я продолжаю сеанс сборки, это то, что я вижу в глобальном 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>
...
person Aristos    schedule 17.10.2016
comment
OracleClient не в местах, описанных в ответе. По умолчанию machine.config содержит <section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>. Может ли это вызвать загрузку клиента оракула? Как заставить .NET не загружать его без ручного изменения machine.config на каждом клиентском сервере? - person Andrus; 17.10.2016
comment
@Andrus Аналогично, в разделе configSection вашего web.config добавьте строку <configSections><remove name="system.data.oracleclient"></remove>..., чтобы удалить ее. - person Aristos; 17.10.2016
comment
Это вызывает ошибку invalid child element 'remove' . Я обновил вопрос своими попытками удалить его - person Andrus; 17.10.2016
comment
Конфигурация Oracle нигде не определена. приведет ли наличие определения раздела Oracle в файле machine.config к загрузке сборки System.Data.OracleClient? - person Andrus; 17.10.2016
comment
@Andrus То, что у меня есть здесь, я сначала тестирую, на моем компьютере по какой-то причине не возникает ошибка, но она работает. Теперь определение раздела оракула не вызывает загрузки сборки, если вы не используете эту часть в web.config. - person Aristos; 17.10.2016
comment
Я разместил его в stackoverflow.com/questions/40094420/ - person Andrus; 17.10.2016

На моей рабочей станции есть ссылки на Oracle во всем файле machine.config. Я полагаю, вы найдете там свои мошеннические ссылки.

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

person hometoast    schedule 17.10.2016
comment
По умолчанию 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 на каждом клиентском сервере? - person Andrus; 17.10.2016