2016-10-17 3 views
1

В ASP.NET MVC4 загружается сборка System.Data.OracleClient.Как загрузить неиспользуемую сборку

код в контроллере

var sb = new StringBuilder(); 
    foreach (Assembly b in AppDomain.CurrentDomain.GetAssemblies()) 
     sb.AppendLine(b.FullName); 

Выходы это:

System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 

По словам How to avoid loading unnessecary assemblies ответ, это вызвано наличием раздела Oracle в machine.config:

<section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 

Попытка удалить с помощью remove element в приложении web.config показать ошибку

enter image description here

и после запуска приложения System.Data.OracleClient все еще появляется в списке загруженных сборок. Решение не содержит прямой ссылки на любое пространство имен Oracle. Как удалить этот amnd другие неиспользуемые сборки из загруженных сборок.

Приложение работает в VPS с ограниченной памятью и, надеюсь, это освобождает память.

+0

Вы использовали Ctrl-F для поиска решения для «использования System.Data.OracleClient;» OracleClient является частью System.Data, поэтому, если вы ссылаетесь на это, пространство имен OracleClient будет доступно. –

+0

Решение проблемы для слова 'oracle' did not found. 'using System.Data', но он не должен вызывать сборку Oracle. – Andrus

+0

@Andrus. Один вопрос, помимо этого сообщения, сайт запущен или нет? – Aristos

ответ

2

После дальнейшего расследования я обнаружил, что этот system.data.oracleclient вызывается и используется System.Data, что имеет решающее значение, если вы используете какую-либо базу данных.

После еще более исследования с использованием ILSpy я также нашел, что mscorlib (основную библиотека) также есть ссылки на этот клиент Oracle ... так что, вероятно, вы не можете избежать его вообще ...

Так вам необходимо удалить эту System.Data, чтобы избежать клиента oracle, но он не будет воспроизводиться, если у вас есть какие-либо данные.

Удалите его из узлов, а у меня есть пост здесь https://stackoverflow.com/a/40085122/159270

<compilation> 
    <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="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>   
</compilation> 

Теперь сообщение, что вы видите на визуальной студии, если ложная тревога, потому что Visual Studio не может скомпилировать web.config как IIS ... фактически удаляются работы и сайт запускается.

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

Наиболее важным является сведение к минимуму трубы линии запроса, как у меня есть тип на моем предыдущем ответе ...

+0

Приложение использует поставщик данных Npgsql, dBLinq, WebMatrix, пользовательский datareader, RDLEngine. Поэтому 'System.Data' не может быть удалена. Итак, похоже, что загрузка Oracle не может избежать? – Andrus

+0

@ Andrus да, вероятно, вы не можете этого избежать ... теперь я снова сканирую и обнаружил, что 'mscorlib' также вызывает его - это очень простой модуль! – Aristos

+0

@Andrus Ограничить линию трубопровода - это называется по каждому запросу. Этот оракул вызывается - если его зовут - только при запуске. Линия трубопровода на '' на мой предварительный ответ. Вот что я делаю. – Aristos