2009-02-04 33 views
17

ASP.NET web sitesinde bir yöntemi yürütmenin en hızlı yolu nedir?HttpHandlers'den daha hızlı bir şey?

Bu senaryo oldukça basit: Bir web sayfası vurulduğunda çalıştırılması gereken bir yöntem var. Sayfada başka hiçbir şey olmuyor, tek işlenen çıktı "bitti" mesajı. İşlemin olabildiğince hızlı olmasını istiyorum.

Her vuruş benzersizdir, bu nedenle önbellekleme bir seçenek değildir.

Planım, bir HttpHandler kullanmak ve normal bir .aspx sayfası yerine web.config (mypage.ashx) biçiminde yapılandırmaktır. Bu, ek yükü önemli ölçüde azaltmalıdır.

Bu yüzden sorum şu: HttpHandlers kullanmaktan daha fazlasını başarmanın yolu var mı?

cevap

25

Yaptığınıza bağlı olarak, yalnızca bir HttpHandler kullanarak çok fazla gelişme görmeyi beklemezdim. Sadece HttpHandler'ı yazarak ve nasıl çalıştığını görerek başlarım. Daha hızlı olmanız gerekiyorsa, isteği işlerken yaptığınız şeylere daha yakından bakmayı ve neyin optimize edilebileceğini görmeyi deneyin. Örneğin, bir veritabanına giriş yapıyorsanız, bir ağ yerine yerel bir veritabanına yazmayı deneyin. Eğer hala yeterince hızlı değilse, belki daha düşük seviyeli bir şeyler yazabilirsin. Bu noktaya kadar yazman için en kolay olan şeyle yapışırdım.

Referans olarak, yük altında 0-15 ms içinde bir reklam sunabilen (yerel bir veritabanına hedefleme ve oturum açma dahil) ASP.NET'te (HttpHandlers kullanarak) bir reklam sunucusu yazdım. Oldukça fazla işlem yaptığımı sanıyordum - ama bu oldukça iyi bir yanıt zamanı IMHO. birkaç ay sonra


Güncelleme:

varsayılan olarak dahildir temizlerseniz tüm HttpModules bu yükü adil bir miktar kaldırmak olacaktır.

  • OutputCache
  • Session (oturum durumu için)
  • windowsAuthentication
  • FormsAuthentication
  • PassportAuthentication
  • : Varsayılan olarak, aşağıdaki HttpModules makine seviyesinde web.config dosyası üzerinden her site dahildir
  • RoleManager
  • Url Yetkilendirme
  • FileAuthorization
  • AnonymousIdentification
  • Profil
  • errorHandler
  • ServiceModel

Yukarıda, benim reklam sunucusu Bunlardan herhangi kullanmaz, bu yüzden sadece bu uygulama en içinde yaptık Dediğim gibi ağ.yapılandırma:

<httpModules> 
    <clear /> 
</httpModules> 

o bazı gerekiyorsa, ama hepsi değil, sen olanları kaldırabilirsiniz İhtiyacınız olmayan:

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

ASP.NET MVC Not: ASP.NET MVC geçici çözüm için belirli bir şey yapmadıkça oturum durumu modülü gerektirir. Daha fazla bilgi için bu soruya bakın: IIS7 How can I disable session state in ASP.NET MVC?

Güncelleme: Maalesef işler IIS7'de oldukça basit değildir. Burada tam senaryonun ne olduğundan emin değilim, ancak tüm sayfanızın yaptığı bazı veriler işliyorsa, gerçekten bir aspx sayfasına veya bir http işleyicisine ihtiyacınız yoktur. how to clear HTTP Modules in IIS7

+0

Artık ölüsünüz: Veritabanına giriş yapacağım. Ve db'ye gitmek yerine küçük metin dosyaları oluşturmayı planladım. Dosyalar daha sonra işlenecek. Ancak, elde ettiğiniz deneyim ve etkileyici yanıtınıza bağlı olarak, basit bir HttpHandler ve db erişimi ile devam edeceğim. –

+1

Yaptığımız, yazılan web sunucularına bir SQL Express örneği koyduktan sonra web sunucusu örneklerinden tüm verileri ana SQL sunucumuza çeken bir iş var. –

+0

Harika, güncelleme için teşekkürler. Çok kullanışlı. –

1

İhtiyacınız olanı yapmak için bir ASMX web servisi veya WCF servisi yazabilirsiniz ve bu büyük olasılıkla daha az masraflı olacaktır. WCF hizmetinin ASP.NET'te barındırılması bile gerekmez. Bir Windows servisinden veya konsol uygulamasından ev sahipliği yapabilir ve adlandırılmış yöneltmeler kullanarak şirket içi probu diyebilirsiniz. Bu muhtemelen veri işleme kodunu önemli ölçüde çağırmak için ek yükü azaltacaktır.

+0

İyi bir çağrı, bunun bir iç süreç olabileceğini aklımdan geçmedi. Sanırım ne yaptığı hakkında daha fazla bilgiye ihtiyacımız var. –

+0

Sunucuda istemci tarafı olayı kaydetmem gereken bazı AJAX/javascript şeyler yapacağım. WCF servis yöntemini js'den nasıl uygulayacağımı tam olarak bilmiyorum, ama kesinlikle bu konuda biraz araştırma yapacağım. :) HttpHandlers şimdilik şimdilik benim için en iyi çözüm. Yanıtların için teşekkür ederim. –

+0

Bir WCF servisini js'den aramak, aslında bir geri dönüş değeriyle (sadece yangın ve unut) ilgilenmeniz gerekmiyorsa, düşünebileceğinizden daha kolaydır. Daha fazla bilgi için http://msdn.microsoft.com/en-us/library/bb514961.aspx adresine bakın. – davogones

0

Eğer gerçekten asp.net kullanmanız gerekiyorsa, AuthorizeRequest adımına da girebilir ve oradan gelen talebi engelleyebilir, işleminizi yapabilir ve Done cevabınızı doğrudan yazabilirsiniz.