Yeniden yüklemeden .NET web sitesini güncelleyin


13

Ben de web sitelerini geliştirmek için kullanılan PHPve ASP classicve bir şey gerekli değiştirilmesi durumunda. Tek bir / birkaç dosyayı değiştirebilirdiniz ve kimse gerçekten fark etmezdi. Belki birileri yükleme sırasında değiştirilen dosyayı isterse, ancak bu yarım saniye marjına benzer. Çoğu küçük site için sorun değil.

Ancak en son siteler birlikte oluşturulur C# MVCve kodda değişiklik yaptığınızda, web sitenizi yeniden oluşturmanız ve değiştirilen DLLdosyaları yüklemeniz gerekir . Ancak DLLdosyalarınızı değiştirdiğinizde, web sitenizi yeniden başlatır ve tümünü etkinleştirir sessions. Ayrıca her şeyi yeniden yüklemek zorunda ve büyük sitelerle her şeyi yüklemek birkaç dakika sürebilir. Siteye göz atan herkes fark edecek ve tekrar giriş yapması gerekiyor.

Büyük site güncellemeleri o kadar yaygın değildir, bu yüzden bu bir sorun değildir. Ancak promosyonlar için düzenli "küçük" güncellemelerimiz var. 'Bu formu doldurun ve üç aylık ücretsiz üyelik kazanın' veya '... adlı resmi yükleyen ilk 10 kişi bir fiyat alacak' gibi. Bence sapmayı alacaksın. Bazı promosyonlar benzerdir ve ayarlara dayalı olarak doğru bilgileri gösteren bir modülle ele alınabilir, ancak genellikle özel kod gerektirir.

Her promosyon vardır kendi olan bir sistemin düşünüyordum DLLbir arabirimde tabanlı dosya ve ardından yüklemek DLLkullanarak dinamik Type.GetType, Activator.CreateInstanceve InvokeMember. Bu işe yarayabilse de, bunun doğru yol olup olmadığını merak ediyorum.

Benim sorum: Bir .NETsiteyi tüm siteyi yeniden yüklemeden ve oturumu bırakmadan (geri dönüşüm uygulama havuzu gibi) anında nasıl güncellersiniz .


Ödül yorumunuza yanıt olarak: Kod üzerinde çalıştığım büyük web siteleri, koddaki büyük değişiklikleri ele aldıkları gibi kod üzerinde küçük değişiklikler yapıyor: yük dengeleyiciler ve işlem dışı oturumlar aracılığıyla - çünkü canlı olarak dağıtılan tüm kodların geçmesi gerekiyor bir gözden geçirme / oturum kapatma işlemi yaptığımızda sunuculara kod bırakamayız. "Büyük" tanımlarımızla eşleşmeyebilir sanırım;)
Zhaph - Ben Duguid

Yanıtlar:


11

"Uygulama Başlatma" konusuna bakın IIS 7.5, Windows 2008 R2 (kurulumu daha zor) IIS 8, Windows 2012

Uygulama Başlatma, herhangi bir uygulamanın (site değil uygulama havuzu) yeniden başlamasına izin verir ve yeni uygulama başlangıcını ısıtırken eski uygulamayı çalıştırmaya devam eder. Yeni uygulama döndürüldüğünde (ayarlayabileceğiniz URL'ler tarafından belirlenir), yeni uygulamayı kullanmaya başlar ve bir öncekini kapatır. Uygulama başlatma işlemini, uygulama havuzu yeniden başlatmalarında oturumun kalmasını sağlamak için yöntemlerle birlikte kullanmak, sitenizin sorunsuz bir şekilde yeniden başlatılmasına izin verebilir. (Zhaph'ın makine tuşu hakkında iyi bir notu var.)

Uygulama Başlatma yapılandırması için yukarıdaki bağlantılara ek olarak, bir sitenin yeniden başlatılmasını neyin tetiklediğine bakmak isteyeceksiniz - sitenin yeniden başlatılması Uygulama Başlatma'yı kullanmadığından , sitenin yeniden başlatılması sorunsuz olmayacaktır.

IIS'yi, bir DLL güncelleştirmesinin hemen bir sitenin yeniden başlatılmasını veya web.config dosyasında (sitenizle ilgili olarak httpRuntime ve harici yapılandırma dosyalarındaki yüksek ChangeNotification değerleri) değişiklikleri tetiklemeyeceği şekilde yapılandırabilirsiniz.

Nihai sonuç, site yeniden başlatmadan DLL'leri / kodu güncelleyebilmeniz ve ardından kodun sorunsuz bir şekilde değiştirilmesi için AppInitialization arka planını kullanacak bir uygulamayı yeniden başlatmayı zorlamanızdır.

Bunları konserde yapmak kesintisiz yeniden başlatmalar için oldukça iyi çalışır.


Orada iyi adımlar kümesi - kesinlikle dikkate alınması gereken bir şey :)
Zhaph - Ben Duguid

Bu aradığım şey gibi geliyor. Bir denemek ve kurmak olacak. Teşekkürler
Hugo Delsing

@HugoDelsing Umarım sizin için harika çalışır.
jeffreypriebe

Teşekkür ederim, kullandığım şey bu ve harika çalışıyor.
Hugo Delsing

@HugoDelsing Sizin için de işe yaradığını duyduğuma sevindim.
jeffreypriebe

5

İstediğinizi ele almanın birkaç yolu ve sorunuzun birkaç farklı yönü vardır:

Promosyonlar için küçük güncellemeler yapın

Burada peşinde olduğunuz şey, içeriği anında düzenlemenize izin veren bir içerik yönetim sistemi veya benzeri bir şeydir (Wordpress / Drupal'ı veya .NET bakış açısından N2 CMS, Umbraco, Orchard vb.) o rotadan gitmediyseniz deneyebileceğiniz şeyler.

ASP.NET yalnızca belirli dosya türlerine (web.config (s), çoğunlukla /bin/ve /app_code/klasörlerin içeriğine) dokunursanız gerçekten yeniden yüklendiğinden ve "diğer dosya değişiklikleri" için yapılandırılabilir bir limite sahip olduğundan (temelde sitenizdeki birçok dosya uygulama havuzu yeniden başlatılır - NumRecompilesBeforeAppRestart) .html, çektiğiniz ve gerektiğinde görüntülediğiniz bazı statik (yani ) dosyalar için farklı bir klasörü kontrol ettiğiniz bir şeyi yapmaya bakabilir veya LoadControlbir dize yolu alan yöntemi kullanabilirsiniz . bir .ascxkullanıcı denetimi ve dinamik olarak yükler - nasıl gösterileceğini StackOverflow için daha farklı bir soru olduğunu nasıl belirlediğiniz - ancak bir adlandırma kural tabanlı çözüm öneriyoruz.

Eklenti tabanlı bir mimari yazmanıza ve izleyeceğiniz dizinin dışında bir klasör belirtmenize olanak tanıyan Yönetilen Genişletilebilirlik Çerçevesi (sürüm 4'ten beri .NET çerçevesinin tam bir parçası olan MEF) gibi bir şey de kullanabilirsiniz /bin/. yeni .DLL'ler - Uygulamanın yeniden başlatma sorununu önleyip önleyemeyeceğini görmek için denememe rağmen, bir siteye ortak işlevsellik eklemek için bunu bir web ortamında iyi etki için kullandım.

Bu itiraz etmiyorsa, düşünebildiğim diğer tek seçenek, denetimleri klasik ASP'de yaptığımız gibi "ön kod" olarak eklemek olacaktır - yani <script runat="server">derlenmiş bir "arkada kod" sınıfı yerine bir blokla Çalıştırmak için mantığı içeren - bu, kontrol anında derlendiğinden ilk kez performans kaybı pahasına bir DLL değişikliği ihtiyacını ortadan kaldıracaktır - yine bunu NumRecompilesBeforeAppRestarteğer birçok küçük değişiklik yapıyorsunuz.

Uygulama yeniden başlatmalarında oturumları nasıl sürdürebilirim?

Bu muhtemelen çözülmesi daha kolay bir sorundur ve üç temel adımı içerir:

  1. MachineKey'i (IIS7, ancak 8 için tutar) sabit bir değer olacak şekilde yapılandırınAutoGenerate - bu, AppPool geri dönüştürüldüğünde aynı anahtarı kullanacağı ve böylece oturum çerezlerinin, görünüm durumunun vb. geri dönüşüm.
  2. Ya kurulum Devlet Sunucu veya oturum durumu tutmak için bir veritabanı yapılandırmak .
  3. Kullanmaktan Anahtarı InProciçin StateServerveya SQLServerweb.config SessionState elemanda.

Bu şekilde, uygulamanın yeniden başlatılmasını sağlayan kalıcı oturumlara sahip olursunuz. Bununla birlikte, bunlar "ücretsiz" değildir - oturumda sakladığınız her şey artık serileştirilebilir olmalıdır ve her sayfa yükünün artık ek ağ gezileri alması ve oturum verilerini serbest bırakması gerekeceğinden hafif bir performans artışı elde edersiniz.

Ancak, uygulamanın dağıtımdan sonra yeniden başlatılması "birkaç dakika" süren bir konumdaysanız, yük dengeli bir ortama veya en azından çalışırken değiştirilebilen bir Hazırlama / Canlı kurulumuna geçmeyi düşünebilirsiniz. (Azure / AWS / vb. tarafından sağlananlar gibi) - bu şekilde bir sunucuyu güncellerken çevrimdışı duruma getirebilir veya yeni kodla hazırlayıp ardından değiştirebilirsiniz - paylaşılan adresleme adımlarını atmış olmanız şartıyla oturumları (yukarıya bakın) bu, kullanıcılarınız üzerinde hiçbir etkisi olmadan iyi çalışır.


Uzun cevabın için teşekkürler. Ne yazık ki CMSistediğim bir şey değil. İçeriği değiştirmek istemiyorum, kodu değiştirmek istiyorum. Oturumlarla ilgili kısım sadece bir örnektir. Bunu değiştirmek, DLLdosyaları yeniden yüklerken sitenin bir veya iki dakika kapalı kalması sorununu çözmez . Bu MEFbölüm ilginçti, ama düşündüğüm sisteme üçüncü taraf bir çözüm. Bu yüzden çaba için +1, ama ne yazık ki bu sorumun cevabı değil.
Hugo Delsing

1
Cevabımı şu noktalara değinmek için güncelledim: MEF MS tarafından piyasaya sürüldü ve v4'ten beri .NET çerçevesinin tam bir parçası oldu. Yeni denetimleriniz için ön kod kullanmayı deneyebilir, alternatif olarak bir sunucuyu
açıp

1
Uygulama Başlatma'yı kullanarak alternatif bir çözüm belirledim. Bunun yararı, tüm kod ve sunucu kurulumunun özel yük dengeleme veya dinamik olarak yükleme kontrolleri olmadan "normal" olması ve çalışma ortamınızı basit tutmasıdır. Tabii ki, bir yük dengeleme / evreleme-canlı kurulum başka nedenlerle de yararlı olabilir.
jeffreypriebe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.