Bagaimana menghindari memuat rakitan yang tidak perlu

Aplikasi ASP.NET .NET 4.6 MVC4 memuat rakitan yang tidak perlu, mis. Sistem.Data.OracleClient . Oracle tidak digunakan.

Ketergantungan perakitan dibuat menggunakan kode di pengontrol

        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);
        }

Keluarannya ada di bawah. Menurut referensi System.Web ini ke System.Design dan System.Design referensi ke System.Data.OracleClient

Aplikasi MVC berjalan di server VPS dengan memori terbatas. Bagaimana cara memperbaikinya agar rakitan yang tidak perlu tidak dimuat? Mudah-mudahan ini akan mengosongkan sebagian memori di server 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

bagian pengikatan web.config juga tidak memuatnya:

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

Perbarui

Saya mencoba sesuai dengan jawaban untuk menempatkan perintah hapus ke web.config tetapi mendapat kesalahan

masukkan deskripsi gambar di sini

Juga mencoba menghapus bagian Oracle sesuai dengan jawaban yang digunakan

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

tapi mendapat kesalahan:

masukkan deskripsi gambar di sini

Bagaimana memperbaikinya ?


person Andrus    schedule 17.10.2016    source sumber
comment
klik kanan pada referensi proyek dan klik hapus akan melakukannya, apakah Anda mencari opsi lain?   -  person Shiham    schedule 17.10.2016
comment
System.Data.OracleClient tidak direferensikan oleh proyek apa pun yang merupakan solusi. Namun keluaran yang dimaksud menunjukkan bahwa itu masih dimuat.   -  person Andrus    schedule 17.10.2016
comment
apakah ada referensi pada bagian pengikatan perakitan runtime di web.Config?   -  person Shiham    schedule 17.10.2016
comment
Tidak. Saya memperbarui pertanyaan dan menambahkan bagian pengikatan. Saya mencari solusi untuk kata Oracle dan belum menemukan pernyataan penggunaan atau referensi langsung.   -  person Andrus    schedule 17.10.2016
comment
Saya sendiri memerlukan penyegaran tentang topik ini, dan menemukan tautan yang sangat berguna: weblog.west-wind.com/posts/2012/Nov/03/. Dari artikel tersebut tampaknya Anda kurang beruntung: ASP.NET akan memuat semua referensi (bahkan yang tidak digunakan), sedangkan mis. aplikasi Konsol sederhana tidak akan melakukannya. Jika semua ini benar maka Anda mungkin harus menerimanya.   -  person Peter B    schedule 17.10.2016
comment
ASP.NET tidak memiliki referensi penyedia data hard-coded. System.Data.OracleClient tidak boleh direferensikan dari System.Web, System.Design dan majelis serupa. Kenapa masih dimuat? Mungkin ada konfigurasi tersembunyi yang memaksanya memuat secara dinamis?   -  person Andrus    schedule 17.10.2016
comment
Periksa contoh Oracle di machine.config Anda.   -  person hometoast    schedule 17.10.2016


Jawaban (2)


Ada tiga jenis rakitan pada aplikasi web.

  1. rakitan yang disertakan dengan perpustakaan (dll) yang Anda gunakan
  2. rakitan yang merupakan versi kompilasi aplikasi web Anda
  3. majelis yang utama untuk menjalankan situs

Perpustakaan

Dalam kasus pertama, Anda dapat mengoptimalkan perpustakaan Anda, menghapus semua referensi yang tidak diperlukan langsung ke proyek dll Anda.

Referensi

Dalam kasus kedua untuk mengoptimalkan halaman web Anda dan apa yang harus dikompilasi, Anda perlu menghapus referensi yang tidak perlu pada kode di belakang... misalnya halaman biasanya memiliki baris pertama ini

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

dan yang tidak dipakai ada warna abu-abu, bisa dihilangkan...

majelis web

Dan sekarang bagian yang sulit – sulit karena Anda harus memainkan permainan “coba/gagal”. Sekarang apa yang bisa Anda hapus dan dari mana.

Pertama di mana saya mencari untuk menemukan apa yang harus dihapus... dan jawabannya ada di web.config global di asp.net. Dalam kasus saya, saya pergi ke direktori windows, pada versi kerangka kerja saya saat ini, pada direktori config dan menemukan web.config

Di sana saya menemukan beberapa kunci....

Pertama, Anda dapat menghapus Modul Http yang tidak diperlukan untuk pipeline yang lebih cepat di httpModulesesi pada web.config

Inilah yang saya lihat di web.config global

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

dan saya membuka web.config di aplikasi saya dan inilah cara saya menghapus apa yang tidak saya gunakan:

<httpModules>
  <remove name="Session" />
  <remove name="PassportAuthentication" />
  <remove name="AnonymousIdentification" />
</httpModules>

Sekarang untuk kasus Anda, saya melanjutkan sesi majelis, inilah yang saya lihat di web.config global:

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

ini apa adanya saya salin/tempel ke web.config saya dan tempatkan <clear /> pada baris pertama kemudian saya mulai menghapus baris yang saya TAHU bahwa program saya tidak digunakan... dan berhati-hatilah untuk menyimpan baris ini <add assembly="*" /> dan pada akhirnya, ini mengatakan untuk menambahkan perpustakaan Anda dari direktori dll Anda.

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

Membuat ini dan menghapus yang tidak Anda gunakan, dengan menghapus dan melihat apakah aplikasi Anda masih berfungsi, Anda dapat membatasi banyak rakitan yang Anda gunakan.

Saya membuat tes sederhana dan dengan menghapus baris ini

<add assembly="System.WorkflowServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

Saya menghitung dari 83 hingga 79 hanya rakitan yang dimuat kali ini. Mengapa lebih dari satu minus? karena WorkflowServices memuat lebih banyak lagi sendiri.

Untuk menghapus sesuatu dari bagian konfigurasi, sekali lagi di web.config Anda melakukannya sebagai:

<configuration> 
  <configSections>
        <remove name="system.data.oracleclient"></remove>
...
person Aristos    schedule 17.10.2016
comment
OracleClient di bukan di lokasi yang dijelaskan dalam jawaban. Default machine.config berisi <section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>. Bisakah ini menyebabkan pemuatan klien Oracle? Bagaimana cara memaksa .NET untuk tidak memuatnya tanpa mengubah machine.config secara manual di setiap server pelanggan? - person Andrus; 17.10.2016
comment
@Andrus Serupa, di configSection di web.config Anda tambahkan baris <configSections><remove name="system.data.oracleclient"></remove>... untuk menghapusnya - person Aristos; 17.10.2016
comment
Hal ini menyebabkan kesalahan invalid child element 'remove' . Saya memperbarui pertanyaan dengan upaya saya untuk menghapusnya - person Andrus; 17.10.2016
comment
Konfigurasi Oracle tidak ditentukan di mana pun. akankah kehadiran definisi bagian Oracle dalam file machine.config menyebabkan perakitan System.Data.OracleClient memuat? - person Andrus; 17.10.2016
comment
@Andrus Apa yang saya ketik di sini Saya pertama kali mengujinya, di komputer saya karena alasan tertentu tidak ada kesalahan, tetapi berfungsi. Sekarang definisi bagian Oracle tidak menyebabkan pemuatan perakitan apa pun kecuali Anda menggunakan bagian ini di web.config. - person Aristos; 17.10.2016
comment
Saya mempostingnya di stackoverflow.com/questions/40094420/ - person Andrus; 17.10.2016

Stasiun kerja saya di tempat kerja memiliki referensi ke Oracle di seluruh mesin.config saya. Saya yakin Anda akan menemukan referensi jahat Anda di sana.

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

person hometoast    schedule 17.10.2016
comment
Default machine.config hanya berisi <section name="system.data.oracleclient" type="System.Data.Common.DbProviderConfigurationHandler, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>. Bagian konfigurasi klien Oracle tidak ditentukan di mana pun. Bisakah ini menyebabkan pemuatan klien Oracle? Bagaimana cara memaksa .NET untuk tidak memuatnya tanpa mengubah machine.config secara manual di setiap server pelanggan? - person Andrus; 17.10.2016