ASP.NET'in Gizli Özellikleri [kapalı]


292

Bu soru, tarihsel öneme sahip olduğu için var, ancak bu site için iyi, konu ile ilgili bir soru olarak kabul edilmediğinden, lütfen benzer soruları burada sorabileceğinizin kanıtı olarak kullanmayın.

Daha fazla bilgi: https://stackoverflow.com/faq


Saçak senaryolarında her zaman yararlı olacak özellikler vardır, ancak bu nedenle çoğu insan onları tanımıyor. Tipik olarak ders kitapları tarafından öğretilmeyen özellikler istiyorum.

Bildikleriniz neler?


Güzel soru, keşke birden çok kez oy verebilseydim!
Gavin Miller

1
Kabul. Bunun gibi konuları seviyorum. Çerçevenin o kadar derinliği var ki, bazen orada hiç bilmediğiniz şeylere hayran oluyorsunuz.
Deane

Bu konudaki yanıtlardan çok sayıda harika yeni numara öğreniyorum - teşekkürler! :)
Maxim Zaslavsky

16
".. 'ın Gizli özellikleri" yerine, bu şeyler "Az Bilinen özellikleri .." olarak adlandırılmamalıdır, çünkü her cevabın çoğu MSDN'de veya başka bir yerde iyi belgelenmiştir, sadece yaygın olarak bilinmez veya kullanılmaz.
John K

Bkz meta.stackexchange.com/questions/56669/... , meta.stackexchange.com/questions/57226/... ve uygunluğu ve kapanış tartışmaya ilişkin Meta mesajları.

Yanıtlar:


335

Test sırasında, SMTP sunucusu yerine bilgisayarınızdaki bir klasöre e-posta gönderebilirsiniz. Bunu web.config dosyasına koyun:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

6
Gerçekten mi? Dumbster gibi sahte bir SMTP Sunucusu kurmak üzereydim. Ben mücevher gizli.
Eduardo Molteni

2
Dizin konumu için bir UNC paylaşımı belirleyip belirleyemeyeceğinizi bilen var mı?
Mark Sherretta

32
Daha da iyisi, bunu dev box machine.config dosyasına koyun, böylece oluşturduğunuz her uygulamada web.config dosyasını değiştirmeniz gerekmez.
Max Toro

Bunu yalnızca yerel ana bilgisayarda yapacak şekilde ayarlayabilir misiniz? Bu şekilde her seferinde değiştirmek zorunda kalmazsınız?
chobo2

Bunun için bir ayar yok. Yapılandırma farklılıklarını diğer yöntemleri (Web Dağıtım Projeleri, Derleme görevleri vb.) Kullanarak yönetmeniz gerekecek
John Sheehan

210

Bir web uygulaması dizininin köküne app_offline.htm adlı bir dosya yerleştirirseniz , ASP.NET 2.0+ uygulamayı kapatır ve yalnızca uygulama_offline.htm içeriğini gösteren yeni gelen isteklerin normal şekilde işlenmesini durdurur. tüm yeni istekler için dosya .

Bu, bir Üretim sunucusuna değişiklikleri yeniden dağıtırken (veya geri alırken) "Site Geçici Olarak Kullanılamıyor" bildiriminizi görüntülemenin en hızlı ve en kolay yoludur.

Ayrıca, marxidad tarafından belirtildiği gibi , IE6'nın doğru şekilde işleyebilmesi için dosyada en az 512 bayt içerik bulunduğundan emin olun.



1
Ah! Bunu MOSS 2007 ile kullanırken dikkatli olun. Yalnızca son IIS yeniden başlatıldığından beri erişilen sayfalar için çalışır. Bu nedenle, bu sayfayı wss sanal köküne eklerseniz, daha önce erişilmemiş bir sayfayı açmaya çalışın, bir 404 alırsınız.
Marc

1
@Marc - Bu ipucunu Scott Guthrie'den aldınız, cömert hissediyorsanız, Gu'nun makalesine yorum yaptıysanız çok sayıda SharePoint geliştiricisinin bu senaryodan kaçınmasına yardımcı oluyorsunuz
Troy DeMonbreun

Ayrıca, bu da Uygulama Alanının geri dönüşümünü tetikleyecek ve tüm istekler bittikten sonra açık veritabanı bağlantılarını kapatacaktır.
Bart Verkoeijen

Buna bir uyarı var: IIS, 404 HTTP Durum Kodu ile app_offline.htm içeriğini döndürür. Bir arama motoru dolaşıp bu çevrimdışı moddayken sitenizi dizine eklemeyi denerse sonuçları beğenmeyebilirsiniz. Ama benim özel kurumsal web uygulaması için harika çalışıyor!
Larry Silverman

119
throw new HttpException(404, "Article not found");

Bu, customErrors sayfasını döndürecek ASP.NET tarafından yakalanır. Gün Sonu .NET İpucu Son zamanlarda bu bir şey öğrendim


Bazı geliştiriciler, .NET kitaplarında oldukça pahalı bir işlem olan bir istisna atmak yerine işleri HttpContext.Response'ye manuel olarak sarmanın daha iyi olduğunu iddia edebilirler.
lubos hasko

Bu kötü bir form değil mi? Bir hata / istisna görüntülemek istediğiniz halde 404 hatasını gösteriyorsunuz.
Donnie Thomas

1
Düşünebileceğim bir durum, birisi kötü niyetli olarak parametrelerle uğraşıyorsa ve geçersiz bir şey koyarsa, büyük bir olasılıkla belirli bir hata değil, genel bir 404 istersiniz.
John Sheehan

3
Tamamen seçildi çünkü artık Günün .NET İpucu sitesinin farkındayım.
Kon

yalnızca httpModule veya
httpHandler'a attığınızda çalışır

75

İşte en iyisi. ÇOK daha hızlı derleme için bunu web.config dosyasına ekleyin. Bu, bu QFE aracılığıyla 3.5SP1 sonrasıdır .

<compilation optimizeCompilations="true">

Hızlı özet: ASP.NET'te bazı senaryolarda derleme hızını büyük ölçüde artırabilecek yeni bir optimizeCompilations anahtarı sunuyoruz. Bazı yakalamalar var, bu yüzden daha fazla bilgi için okumaya devam edin. Bu anahtar şu anda 3.5SP1 için QFE olarak mevcuttur ve VS 2010'un bir parçası olacaktır.

ASP.NET derleme sistemi, 'üst düzey' bir dosya değiştiğinde yaptığı önceki işleri silmesine neden olan çok muhafazakar bir yaklaşım benimser. 'Üst düzey' dosyalar, bin.ve App_Code öğelerinin yanı sıra global.asax dosyasındaki her şeyi içerir. Bu, küçük uygulamalar için iyi çalışırken, çok büyük uygulamalar için neredeyse kullanılamaz hale gelir. Örneğin, bir müşteri bir 'bin' derlemesinde herhangi bir değişiklik yaptıktan sonra bir sayfayı yenilemenin 10 dakika sürdüğü bir durumla karşılaşıyordu.

Acıyı hafifletmek için, yeniden derlemeye çok daha az muhafazakar bir yaklaşım gerektiren 'optimize edilmiş' bir derleme modu ekledik.

Via burada :


6
Bu VS 2010 ile "varsayılan olarak açık" mı yoksa yine de denemeli miyim?
M4N

73
  • HttpContext.Current , Sayfa özelliklerine (örneğin gevşek bağlanmış bir yardımcı sınıftan) erişiminiz olmasa bile, her zaman geçerli bağlamın İstek / Yanıt / vb. Bilgilerine erişmenizi sağlar.

  • Response.Redirect ( url , false ) öğesini çağırarak kullanıcıyı başka bir adrese yönlendirdikten sonra aynı sayfada kod yürütmeye devam edebilirsiniz.

  • İstediğiniz tek şey derlenmiş bir Sayfa (veya herhangi bir IHttpHandler ) ise .ASPX dosyalarına ihtiyacınız yoktur . Sadece içeri sınıfa noktaya yöntemler yolu ayarlayın ve HTTP eleman web.config dosyasında.<httpHandlers>

  • Bir Sayfa nesnesi, bir alınabilir .aspx programlı arayarak dosyanın PageParser.GetCompiledPageInstance (SanalYol, aspxFileName, Bağlam)


Response.Redirect (url, false) - Oldukça uzun bir süre umduğum şey bu kadar .. Bunu nasıl özlediğimi bilmiyorum ama thanxxx
Subliminal Hash

1
Birisi bununla ne yapacağınızı açıklayabilir mi? Bunun bir değeri olduğunu biliyorum, ama nedenini anlayamıyorum ...
Deane

5
Kullanıcıyı farklı bir adrese yönlendirmek istiyorsanız, ancak yine de yapacak bazı arka uç işlemleriniz varsa (örneğin, raporu arka planda oluşturmaya devam ederken raporun üretim durumu sayfasına yönlendiren bir rapor oluşturma isteği)
Mark Cidade

Birisi PageParser.GetCompiledPageInstance (..) için yararlı bir durumu açıklayabilir mi? Belgeler bunun altyapı kullanımı için olduğunu söylüyor - bir IHttpHandler türü döndürüyor, bu yüzden pratik olarak nasıl kullanılabileceğini göremiyorum.
John K

@jdk: Geçmişte dinamik bellek içi IHttpHandler nesnelerini kullanabilmek için aynı zamanda fiziksel * .aspx dosyaları için GetCompiledPageInstance () yöntemini kullanabilmem için * .aspx istekleri için varsayılan işleyiciyi geçersiz kılmakta kullandım.
Mark Cidade

70

Machine.config düzeyinde perakende satış modu:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

Hata ayıklamayı false olarak uygulamak, web hatalarını açmak ve izlemeyi devre dışı bırakmak için web.config ayarlarını geçersiz kılar. Artık yayınlamadan önce nitelikleri değiştirmeyi unutmaya gerek yok; bunların tümünü geliştirme veya test ortamları için yapılandırılmış olarak bırakın ve üretim perakende ayarını güncelleyin.


1
Bazen yayınlamadan önce derleme hata ayıklamasını false olarak değiştirmeyi unuturum, bu da performansı olumsuz etkiler. Artık sorun yok!
Roy Tinker

59

İçerik sayfalarında MasterPages için intellisense'i etkinleştirmenin
, bunun çok az bilinen bir saldırı olduğundan eminim

Çoğu zaman, findcontrol yöntemini kullanmanız ve bunları kullanmak istediğinizde ana sayfadaki denetimleri içerik sayfalarından yayınlamanız gerekir, MasterType yönergesi, bunu yaptığınızda görsel stüdyoda zekayı etkinleştirir.

sayfaya bir direktif daha eklemeniz yeterli

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

Sanal Yolu kullanmak ve sınıf adını kullanmak istemiyorsanız

<%@ MasterType TypeName="MyMainMasterPage" %>

Makalenin tamamını buradan edinin


FindControl kullanımı bazen telaşlı olabilir, bu harika ipucu için teşekkürler!
Alexandre Brisebois

4
Bunu kullanmak beklenmedik davranışlara neden olabilir. Bkz. Stackoverflow.com/questions/1998931/…
citronas

Şahsen ben özellik insanlar tarafından bilinmeyen bırakılması gerektiğini düşünüyorum, bu sayfayı ana sayfaya çiftler. Ana sayfanın özelliklerini / yöntemlerini kullanırsanız ve ardından ana sayfayı değiştirirseniz bir bakım kabusu ile sonuçlanırsınız.
Phill

@Phil: Bazen gereklidir ve bir ana sayfaya statik olarak yazılmış bir erişimin bulunması FindControl yaklaşımından çok daha iyidir. En azından derleyici mesajını alıp hızlı bir şekilde düzeltebilirsiniz.
Durden81

58

HttpContext.Istek düzeyinde önbellek aracı olarak öğeler


2
Bu da benim açımdan olacaktı, bu istek düzeyi bilgilerini geçmek / almak için iç içe denetimlerde kullanın. Ii ayrıca MVC'de kısmi görünümlere dayanarak eklenecek js dosyalarının bir listesini saklamak için kullanır.
Tracker1

1
Bu URL'leri benim sayfalarıma getirilen parametreleri geçmek için asp.net yönlendirmeyi kullandığımda kullanın. (MVC ile değil) url yeniden yazma için harika ve oldukça esnektir.
Alexandre Brisebois

Hmmmm, sadece bunu Oturum - ta yerine kullanabileceğim bir yer düşündüm!
Mike Kingscott

52

Kafamda iki şey göze çarpıyor:

1) İz'i koddan açabilir ve kapatabilirsiniz:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) Yalnızca bir paylaşılan "arkada kod" dosyası kullanarak birden çok .aspx sayfası oluşturabilirsiniz.

Bir sınıf .cs dosyası oluşturun:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

ve sonra istediğiniz sayıda .aspx sayfanız olabilir (VS'nin oluşturduğu .designer.cs ve .cs kod arkasını sildikten sonra):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

ASPX'te Class1'de görünmeyen denetimlere sahip olabilirsiniz (ya da tam tersi), ancak denetimlerinizde null olup olmadığını denetlemek için yeniden hatırlamanız gerekir.


Buna oy verirdim, ama oyları tükendi. Bunu oylamaya geri dönmeyi hatırlamaya çalışacağım. Birden fazla sayfa için aynı Code Behind dosyasına sahip olabileceğimizi bilmiyordum. Emin değilim, bunun nasıl çalışacağını.
Vaibhav

5
Başka biri, bir URL'den iz etkinleştirmenize izin vermenin bir güvenlik riski olduğunu düşünüyor mu? (# 1) Bu soruyu küçümsemeyeceğim, ancak oradaki riski anlamak önemlidir.
Kevin Goff

5
Kesinlikle, bu kodu gerçekten bir #ifdef DEBUG #endif bloğuna
koymalısınız

Güvenlik yönünü gösteren harika yorumlar.
Vaibhav

2
Url'den bir iz etkinleştirmek neden bir güvenlik riski oluşturuyor? Bana zarar vermek için nasıl kullanılabilir?
Kamarey

48

Kullanabilirsiniz:

 Request.Params[Control.UniqueId] 

Viewstate ÖNCE bir kontrolün değerini almak için (Control.Text vb. Bu noktada boş olacaktır).

Bu, Init'teki kod için kullanışlıdır.


Viewstate başlatması Request.Params ile işlem yapmaz. Uygulanan IPostBackDataHandler denetiminin LoadPostData yöntemini yükseltmeden ÖNCE kullanın.
chapluck

46

WebMethods.

ASPX sayfalarına yerleştirilen web yöntemlerine ASP.NET AJAX geri çağrılarını kullanabilirsiniz. Statik bir yöntemi [WebMethod ()] ve [ScriptMethod ()] nitelikleriyle dekore edebilirsiniz. Örneğin:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

Şimdi, ASPX sayfanızda şunları yapabilirsiniz:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

Ayrıca, sunucu tarafı yönteminizi JavaScript kullanarak şu şekilde arayın:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

45

Uzun süren bir göreve başlamadan önce istemcinin hala bağlı olup olmadığını kontrol edin:

if (this.Response.IsClientConnected)
{
  // long-running task
}

44

ASP.NET'in az bilinen ve nadir kullanılan bir özelliği:

Etiket Eşleme

Nadiren kullanılır, çünkü sadece ihtiyacınız olan belirli bir durum vardır, ancak ihtiyacınız olduğunda çok kullanışlıdır.

Bu az bilgi özelliği hakkında bazı makaleler:

ASP.NET'te
Etiket Eşleme ASP.NET 2.0'da Etiket Eşleme Kullanma

ve son makaleden:

Etiket eşleme, web uygulamanızdaki her sayfada uyumlu kontrolleri derleme zamanında değiştirmenize olanak tanır. DropDownList gibi bir stok ASP.NET denetiminiz varsa ve bunu DropDownList'ten türetilen özelleştirilmiş bir denetim ile değiştirmek istiyorsanız, faydalı bir örnek verilebilir. Bu, arama verilerinin daha optimize önbelleğe alınmasını sağlamak için özelleştirilmiş bir kontrol olabilir. Her web formunu düzenlemek ve yerleşik DropDownLists'i özel sürümünüzle değiştirmek yerine ASP.NET'in web.config dosyasını değiştirerek bunu sizin için yapmasını sağlayabilirsiniz:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

Ekibinizdeki diğer geliştiriciler için bu çok kafa karıştırıcı olacaktır
Aykut Akıncı

1
@Aykut - Gerçekten olabilir, bu yüzden kullanışlılığının oldukça dar olduğunu, ancak gerektiğinde çok kullanışlı olduğunu belirtiyorum . Ayrıca, herhangi bir karışıklık ve belirsizlikten kaçınmak için Tag Mapping'in herhangi bir kullanımının çok açık bir şekilde belgelendiğinden emin olurum.
CraigTP

43

HttpModüller . Mimari çılgın zarif. Belki gizli bir özellik değil, ama hiçbiri daha az serin.


3
HttpModules gelişmiş bir şeydir, ancak nadir veya daha az kullanılmış (ya da naif olarak adlandırmaz) demem. Ama evet, mimariyi seviyorum.
Vaibhav

+1, çünkü birçok deneyimli geliştirici HttpModules hakkında bilgi sahibi olabilir, ancak isteklerle ilişkilerini tam olarak anlayamaz. (HttpHandlers ile aynı şey)
John Bubriski

34

Sunucu denetimleri de dahil olmak üzere bir sayfanın tüm bölümlerini yorumlamak için .aspx sayfasındaki ASP.NET Yorumları'nı kullanabilirsiniz. Yorumlanan içerikler asla müşteriye gönderilmez.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

5
Yorum olduğunu gerçekten bilmeyen insanlar var mı?
Joe Phillips

7
<! - yorumlarında yarım aspx sayfası bulduğunuzda beğendim - Yorumlar ...
Bryan Rehbein

ASP.NET'in oldukça çıplak bir özelliğidir
rafek

34

Kod İfade Oluşturucu

Örnek işaretleme:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

Kod ifadesi oluşturucunun gerçek güzelliği, veritabanını olmayan durumlarda ifadeler gibi veritabanını kullanabilmenizdir. Diğer işlevleri gerçekleştiren başka İfade Oluşturucuları da oluşturabilirsiniz.

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

Her şeyi gerçekleştiren cs sınıfı:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

1
başlıkta "ve diğerleri" ile ne demek istiyorsun?
Khaled Musaied

Sanırım başkalarına hiç ulaşamadım.
andleer

2
+1, gerçekten harika özellik ... Bu aslında
WPF'nin

bu kullanmakla aynı şey değil <%= /*code*/ %>mi?
bevacqua

33

ASHX dosya türünün kullanımı:
Sayfa olay işleyicilerinden geçmeden bazı temel html veya xml çıktıları almak istiyorsanız, HttpModule'ü basit bir şekilde uygulayabilirsiniz

Sayfayı SomeHandlerPage.ashx olarak adlandırın ve içine aşağıdaki kodu (sadece bir satır) koyun

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Sonra kod dosyası

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

5
İhtiyacınız olursa IRequiresSessionState veya IReadOnlySessionState eklemeniz gerektiğini belirtmek gerekir, aksi takdirde orada olmaz.
Tracker1

3
Ayrıca, web.config dosyasında işleyicinin kurulumunu belirtebileceğinizi de belirtmek gerekir, böylece etrafta fiziksel bir ashx dosyası olması gerekmez. Veya, işleyiciyi genel asax'ta uygulama başlangıcınızda programlı olarak kaydedebilirsiniz.
Phill



26

Önde gelen bir güvenlik şirketi tarafından yapılan bir güvenlik denetiminden geçen bir asp.net uygulaması üzerinde çalıştım ve daha az bilinen ancak önemli bir güvenlik açığını önlemenin bu kolay yolunu öğrendim.

Aşağıdaki açıklama: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Tek tıklamayla saldırılara karşı koymak için Page.ViewStateUserKey kullanmayı düşünün. Arayanlarınızın kimliğini doğrular ve ViewState kullanırsanız, tek tıklatmayla saldırıları önlemek için Page_Init olay işleyicisinde Page.ViewStateUserKey özelliğini ayarlayın.

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

Özelliği, oturum kimliği, kullanıcı adı veya kullanıcı tanımlayıcısı gibi her kullanıcı için benzersiz olduğunu bildiğiniz bir değere ayarlayın.

Tek tıklatma saldırısı, bir saldırgan zaten ViewState verileriyle dolu __VIEWSTATE adlı gizli bir form alanı içeren bir Web sayfası (.htm veya .aspx) oluşturduğunda gerçekleşir. ViewState, 100 öğeye sahip bir alışveriş sepeti sayfası gibi saldırganın önceden oluşturduğu bir sayfadan oluşturulabilir. Saldırgan, şüpheli olmayan bir kullanıcıyı sayfaya göz atmaya yönlendirir ve ardından saldırgan, sayfanın ViewState'in geçerli olduğu sunucuya gönderilmesine neden olur. Sunucunun ViewState'in saldırgandan geldiğini bilmesinin bir yolu yoktur. ViewState doğrulaması ve HMAC'ler, ViewState geçerli olduğundan ve sayfa kullanıcının güvenlik bağlamında yürütüldüğünden bu saldırıya karşı gelmez.

ViewStateUserKey özelliğini ayarlayarak, saldırgan ViewState'i oluşturmak için bir sayfaya göz attığında, özellik adıyla başlatılır. Meşru kullanıcı sayfayı sunucuya gönderdiğinde, saldırganın adıyla başlatılır. Sonuç olarak, ViewState HMAC denetimi başarısız olur ve bir istisna oluşturulur.


2
Ayrıca base.OnInit (e) 'den ayrılmayı da unutmayın; Page_Init () işlevinin işini yapması için.
Druid

Gerçek bir kullanıcı çerezleri kabul etmediyse veya sessionid'in zaman aşımı varsa bu hile başarısız olabilir.
Aristos

1
Sayfa için base.OnInit(e);kullanmanız gerekmiyor AutoEventWireup="true".
Adam Nofsinger

1
Druid: OnInit'i geçersiz kılmaz (bu durumda base.OnInit (e) gerekli olur).
crdx

ViewStateUserKey için oturum kimliğinin kullanılması yalnızca bir oturum gerçekten başladıktan sonra çalışır. Ayrıca, oturum sona erdikten sonra bu sayfaların zaman aşımına uğrayabileceği anlamına gelir. Bu sorunların endişe kaynağı olduğu durumlarda, kullanıcının IP adresi gibi daha dayanıklı bir şey kullanmayı düşünebilirsiniz.
RickNZ

25

HttpContext.Current.IsDebuggingEnabled

Bu, hangi komut dosyalarının (min veya tam sürümler) veya geliştirmede isteyebileceğiniz, ancak canlı olarak yayınlamayacağınız herhangi bir şeyin çıktısını belirlemek için mükemmeldir.


Jan ile hemfikirim, ancak bazen uygulama durumu Debug / Release'nin farkında olan bir uygulamaya sahip olmak ilginç olabilir.
Alexandre Brisebois

20

ASP.NET 3.5 SP1'e dahildir:

  • customErrors artık "ResponseRewrite" değerine sahip "redirectMode" özelliğini desteklemektedir. URL'yi değiştirmeden hata sayfasını gösterir.
  • Form etiketi artık action özelliğini tanıyor. URL yeniden yazmayı kullanırken harika

20

Panellerde DefaultButton özelliği.

Belirli bir panel için varsayılan düğmeyi ayarlar.


1
Dikkat, her türlü düğme üzerinde çalışmaz, örneğin LinkButtons!
Kovu


19

Yapılandırma dosyalarını bölmek için configSource kullanma.

Bir web.config dosyasındaki configSource özniteliğini, yapılandırma öğelerini örneğin yerine başka .config dosyalarına göndermek için kullanabilirsiniz:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

... appSettings bölümünün tamamını başka bir yapılandırma dosyasında saklayabilirsiniz. İşte yeni web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.configdosya:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

Bu, bir uygulamayı bir müşteriye dağıttığınız ve web.config dosyasının kendisine müdahale etmesini istemediğiniz ve yalnızca birkaç ayarı değiştirmelerini istediğiniz senaryolar için oldukça kullanışlıdır.

ref: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx


1
Bu ayrıca herhangi bir .net projesi üzerinde çalışıyor, ex Masaüstü uygulaması. yapılandırmalar
Zoltan Veres



16

Varsayılan olarak, özel denetim için etiketler arasındaki herhangi bir içerik alt denetim olarak eklenir. Bu, filtreleme veya ek ayrıştırma için bir AddParsedSubObject () geçersiz kılmasında ele geçirilebilir (örn. LiteralControls içindeki metin içeriğinin):

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>

13

ASP.NET bir RSS beslemesi oluşturuyorsa, bazen sayfanın üst kısmına fazladan bir satır ekler. Bu, yaygın RSS doğrulayıcılarıyla doğrulanmaz. Sayfanın <@Page>en altına sayfa yönergesini koyarak bu sorunu çözebilirsiniz .


7
RSS yayınları oluşturmak için bir .ASHX işleyicisi kullanmak daha iyi olmaz mıydı?
Dan Diplo

Sanırım bu projenin karmaşıklığına bağlı. Herkesin işleyicileri oluşturma ve derleme yeteneği veya becerisi yoktur. Sayfada asp.net bunun için oldukça iyi çalışıyor
Kevin Goff

1
Çok daha iyi IMO ASHX gelen dizeleri yazarken daha hangi RSS öğelerini oluşturmak ve (bazı öğeleri kaldırmak için LoginView kullanma gibi) diğer hile yapmak: <Tekrarlayıcı asp> Ve gibi bir şey kullanabilirsiniz
Chakrit

LinqToXml + ASHX gitmenin yolu!
Carlos Muñoz

Bu, RSS yayın oluşturma işleminden çok daha fazlası için kullanışlıdır. IIRC, HTML5'in doğru bir şekilde doğrulanması için üstteki ilk satırda <! Doctype html> etiketine sahip olması gerekir.
Roy Tinker

12

ASP.NET v3.5 rotaları eklemeden önce, basitçe bir HTTPModule yazarak ve isteği sayfa başlangıcında (BeginRequest olayı gibi) yeniden yazarak kendi dostu URL'lerinizi oluşturabilirsiniz.

Gibi Url'ler http: // servername / sayfa / Param1 / SomeParams1 / Param2 / SomeParams2 (genellikle düzenli ifadeler kullanarak) aşağıda gibi başka bir sayfaya eşleştirilmemektedir olacaktır.

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke, bunu samimi URL'leri için yapan gerçekten iyi bir HttpModule'ye sahiptir. .NET v3.5'i dağıtamayacağınız makineler için hala kullanışlıdır.


Bu, tüm IIS isteklerinin ASP.NET ile eşlenmesini gerektirir
John Sheehan

Veya sadece 404 hata işleyicisi.
FlySwat
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.