-
Karena terbatasnya kinerja server, saya menemukan bahwa sejak menggunakan Castle + Nhibernate, proses kompilasi ulang server setelah memperbarui situs web sangat lama, terkadang memakan waktu lebih dari 1 menit, meskipun program web yang diterbitkan juga dikompilasi. Berikut ini adalah perpustakaan dinamis yang digunakan oleh web:
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilities.AutomaticTransactionManagement.dll
Castle.Facilities.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
Castle.Windsor.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
log4net.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
UrlRewritingNet.UrlRewriter.dll
Setiap kali proyek web saya diperbarui dan web.dll yang dihasilkan setelah kompilasi ulang diunggah ke server, server w3p akan restart dan csc file di direktori web saya. Seluruh prosesnya sangat lama dan tak tertahankan.
[Saya ingin tahu apakah kalian punya saran bagus]
Belakangan, saya memikirkan apakah memasukkan perpustakaan dinamis di atas ke dalam GAC akan mengurangi waktu yang diperlukan untuk memulai ulang (latihan telah membuktikan bahwa tidak ada perubahan yang jelas).
Artikel ini tidak menyelesaikan masalah aslinya, tetapi karena melibatkan masalah referensi perpustakaan dinamis pihak ketiga yang disimpan di GAC di asp.net, saya tetap mencatatnya (:-) Ini adalah fokus artikel ini).
Semua perpustakaan dinamis di atas telah ditandatangani, dan proses memasukkannya ke dalam GAC adalah:
1. Daftarkan perpustakaan dinamis pihak ketiga ke GAC
gacutil -i Castle.Core.dll
gacutil -i Castle.DynamicProxy2.dll
gacutil -i Castle.Facilities.AutomaticTransactionManagement.dll
gacutil -i Castle.Facilities.NHibernateIntegration.dll
gacutil -i Castle.MicroKernel.dll
gacutil -i Castle.Services.Transaction.dll
gacutil -i Castle.Windsor.dll
gacutil -i FredCK.FCKeditorV2.dll
gacutil -i Iesi.Collections.dll
gacutil -i Intelligencia.UrlRewriter.dll
gacutil -i log4net.dll
gacutil -i MySql.Data.dll
gacutil -i NHibernate.dll
gacutil -i Sistem.Data.SQLite.dll
gacutil -i UrlRewritingNet.UrlRewriter.dll
Proses ini relatif mudah, gacutil dapat ditemukan di bawah SDK .net framework (paket redistribusi)
2. Definisikan ulang cara proyek web mereferensikan pustaka dinamis pihak ketiga: langsung mereferensikan GAC
Masalah lain yang ditemui di sini adalah vs2005 tidak dapat mereferensikan pustaka dinamis pihak ketiga yang ditentukan di GAC kecuali pengaturan berikut dibuat:
Asumsikan bahwa perpustakaan dinamis pihak ketiga yang Anda tetapkan disimpan di: c:3rdlibs
Ubah registri: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
Tambahkan item di bawah proyek ini dan arahkan ke c:3rhlibs
Sekarang kami dapat mereferensikan pustaka GAC pihak ketiga di proyek web kami.
3. Kompilasi ulang web dan debug:
Masalah pertama: kesalahan konfigurasi
lihat salinan biasa ke cetak papan klip?
Kesalahan konfigurasi
Penjelasan: Terjadi kesalahan saat memproses file konfigurasi yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik di bawah dan ubah file konfigurasi dengan tepat.
Pesan Kesalahan Parser: Tidak dapat memuat file atau rakitan 'UrlRewritingNet.UrlRewriter' atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan. (web.config baris 50)
Kesalahan sumber:
Baris 48:
Baris 49: <httpModules>
Baris 50: <tambahkan nama="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
File sumber: web.config Baris: 50
Deskripsi Kesalahan Konfigurasi: Terjadi kesalahan saat memproses file konfigurasi yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik di bawah dan ubah file konfigurasi dengan tepat.
Pesan Kesalahan Parser: Tidak dapat memuat file atau rakitan 'UrlRewritingNet.UrlRewriter' atau salah satu dependensinya. Sistem tidak dapat menemukan file yang ditentukan. (web.config baris 50)
Kesalahan sumber:
Baris 48:
Baris 49: <httpModules>
Baris 50: <tambahkan nama="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
File sumber: web.config Baris: 50
Jelas sekali proyek web kami tidak menemukan perpustakaan yang sudah tersimpan di GAC. Sebelum dimasukkan ke dalam GAC, perpustakaan ini dikompilasi dan dikeluarkan ke direktori web/bin. Sekarang karena tidak dapat ditemukan secara otomatis, kita dapat memodifikasi web.config untuk menentukan bagaimana perpustakaan direferensikan:
lihat salinan biasa ke cetak papan klip?
<konfigurasi>
...
<waktu proses>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly parsialName="log4net" fullName="log4net, Versi=1.2.10.0, Budaya=netral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly parsialName="Castle.Windsor" fullName="Castle.Windsor, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly parsialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</pengikatan perakitan>
</waktu berjalan>
</konfigurasi>
<konfigurasi>
...
<waktu proses>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly parsialName="log4net" fullName="log4net, Versi=1.2.10.0, Budaya=netral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly parsialName="Castle.Windsor" fullName="Castle.Windsor, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly parsialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
... ...
</pengikatan perakitan>
</waktu berjalan>
</konfigurasi>
Kompilasi, debug, dan jalankan lagi
Kesalahan kedua: Kesalahan kompilasi
lihat salinan biasa ke cetak papan klip?
Kesalahan server di aplikasi '/'.
--------------------------------------------------- -----------------------------------
Kesalahan kompilasi
Penjelasan: Terjadi kesalahan saat mengkompilasi sumber daya yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik berikut dan ubah kode sumber dengan tepat.
Pesan kesalahan kompiler: CS0012: Ketik 'Castle.Windsor.IContainerAccessor' didefinisikan dalam rakitan yang tidak direferensikan. Referensi ke perakitan "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" harus ditambahkan.
Kesalahan sumber:
[Tidak ada baris sumber yang relevan]
File sumber: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Baris: 133
Kesalahan server di aplikasi '/'.
--------------------------------------------------- -----------------------------------
Deskripsi kesalahan kompilasi: Terjadi kesalahan selama kompilasi sumber daya yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik berikut dan ubah kode sumber dengan tepat.
Pesan kesalahan kompiler: CS0012: Ketik 'Castle.Windsor.IContainerAccessor' didefinisikan dalam rakitan yang tidak direferensikan. Referensi ke perakitan "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" harus ditambahkan.
Kesalahan sumber:
[Tidak ada baris sumber yang relevan]
File sumber: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Baris: 133
Kali ini kesalahan kompilasi, tetapi pesan kesalahan tidak jelas dan konten spesifik tidak dapat ditemukan untuk saat ini. Ubah web.config dan tambahkan bagian konfigurasi (kompilasi), sebagai berikut
lihat salinan biasa ke cetak papan klip?
<konfigurasi>
<sistem.web>
... ...
<kompilasi debug="benar" />
... ...
</sistem.web>
</konfigurasi>
<konfigurasi>
<sistem.web>
... ...
<kompilasi debug="benar" />
... ...
</sistem.web>
</konfigurasi>
Men-debug lagi:
lihat salinan biasa ke cetak papan klip?
Kesalahan kompilasi
Penjelasan: Terjadi kesalahan saat mengkompilasi sumber daya yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik berikut dan ubah kode sumber dengan tepat.
Pesan kesalahan kompiler: CS0012: Ketik 'Castle.Windsor.IContainerAccessor' didefinisikan dalam rakitan yang tidak direferensikan. Referensi ke perakitan "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" harus ditambahkan.
Kesalahan sumber:
Baris 134: }
Baris 135:
Baris 136: ASP.global_asax ApplicationInstance yang dilindungi {
Baris 137: dapatkan {
Baris 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
File sumber: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Baris: 136
Deskripsi kesalahan kompilasi: Terjadi kesalahan selama kompilasi sumber daya yang diperlukan untuk melayani permintaan ini. Silakan periksa detail kesalahan spesifik berikut dan ubah kode sumber dengan tepat.
Pesan kesalahan kompiler: CS0012: Ketik 'Castle.Windsor.IContainerAccessor' didefinisikan dalam rakitan yang tidak direferensikan. Referensi ke perakitan "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" harus ditambahkan.
Kesalahan sumber:
Baris 134: }
Baris 135:
Baris 136: ASP.global_asax ApplicationInstance yang dilindungi {
Baris 137: dapatkan {
Baris 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));
File sumber: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs Baris: 136
Pesan kesalahan ini adalah yang paling penting:
Pesan kesalahan kompiler: CS0012: Ketik 'Castle.Windsor.IContainerAccessor' didefinisikan dalam rakitan yang tidak direferensikan. Referensi ke perakitan "Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc" harus ditambahkan.
Jelas, setelah kami memodifikasi web.config, layanan iis memulai ulang proyek web saat ini dan mengkompilasinya. Hal pertama yang harus dikompilasi adalah global.asax.cs. Salah satu variabel yang diinisialisasi mungkin juga merupakan variabel statis, Castle. Windsor dipanggil, dan csc tidak dapat menemukan Castle.Windsor ini, yang merupakan proses yang sangat merepotkan.
Upaya pertama: Di bagian referensi proyek web, atur Castle.Windsor. Awalnya, ketika perpustakaan dinamis direferensikan secara langsung, itu dikeluarkan ke web/bin secara sinkron. Setelah GAC direferensikan, keluaran ini dibatalkan . Setel ke "Salin ke lokal". Tentu saja, kompilasi setelah pengaturan akan menampilkan file ini: Castle.Windsor ke web/bin. Dengan cara ini, debugging juga dapat lewat karena dia menemukan perpustakaan dinamis ini.
Namun hal ini tidak menghilangkan keraguan kami, yaitu Majelis yang didefinisikan di <runtime><assemblyBinding>... ...</assemblyBinding><runtime> tidak mempengaruhi proses kompilasi, sehingga harus digunakan selama proses kompilasi Bagian manakah itu?
Upaya kedua: Pikirkan bagian (kompilasi) pada upaya pertama, periksa deskripsi msdn, dan ketahui bahwa ada definisi <assemblies> di <compilation>.
lihat salinan biasa ke cetak papan klip?
<kompilasi debug="false">
<perakitan>
<tambahkan assembly="Castle.Windsor, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
</perakitan>
</kompilasi>
<kompilasi debug="false">
<perakitan>
<tambahkan assembly="Castle.Windsor, Versi=1.0.3.0, Budaya=netral, PublicKeyToken=407dd0808d44fbdc"/>
</perakitan>
</kompilasi>
Kemudian batalkan "Salin ke lokal" untuk Castle.Windsor di proyek web, kompilasi ulang dan jalankan.
Semua Bekerja dengan Baik.
Pada titik ini kami telah berhasil memasukkan semua perpustakaan dinamis yang direferensikan oleh pihak ketiga ke dalam GAC.