Versteckte Funktionen von ASP.NET [geschlossen]

292

Diese Frage existiert, weil sie historische Bedeutung hat, wird jedoch nicht als gute themenbezogene Frage für diese Site angesehen. Verwenden Sie sie daher nicht als Beweis dafür, dass Sie hier ähnliche Fragen stellen können.

Weitere Informationen: https://stackoverflow.com/faq


Es gibt immer Funktionen, die in Rand-Szenarien nützlich wären, aber genau aus diesem Grund kennen die meisten Leute sie nicht. Ich bitte um Funktionen, die normalerweise nicht in den Lehrbüchern enthalten sind.

Was sind die, die du kennst?

Vaibhav
quelle
Gute Frage, ich wünschte, ich könnte mehrmals abstimmen!
Gavin Miller
1
Einverstanden. Ich liebe solche Themen. Das Framework hat so viel Tiefe, dass Sie manchmal erstaunt sind über Dinge, von denen Sie nie gewusst haben, dass sie dort sind.
Deane
Ich lerne so viele coole neue Tricks aus den Antworten in diesem Thread - danke! :)
Maxim Zaslavsky
16
Anstelle von "Versteckte Funktionen von ..." sollten diese Dinge nicht als "Wenig bekannte Funktionen von ..." bezeichnet werden, da fast jede Antwort in MSDN oder anderswo gut dokumentiert ist, nur nicht allgemein bekannt oder verwendet.
John K
Weitere Informationen zur Angemessenheit und zum Schließen finden Sie unter meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… und verwandten Meta-Posts.

Antworten:

335

Während des Tests können Sie E-Mails an einen Ordner auf Ihrem Computer anstatt an einen SMTP-Server senden lassen. Fügen Sie dies in Ihre web.config ein:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
John Sheehan
quelle
6
"Ja wirklich?" Ich wollte gerade einen gefälschten SMTP-Server wie Dumbster installieren. Ich habe Juwel versteckt.
Eduardo Molteni
2
Weiß jemand, ob Sie eine UNC-Freigabe für den Verzeichnisspeicherort angeben können?
Mark Sherretta
32
Besser noch, legen Sie dies auf Ihrer Entwicklungsbox machine.config ab, damit Sie die web.config nicht bei jeder von Ihnen erstellten App ändern müssen.
Max Toro
Können Sie es so einstellen, dass dies nur auf dem lokalen Host ausgeführt wird? Auf diese Weise müssen Sie es nicht jedes Mal ändern?
Chobo2
Dafür gibt es keine Einstellung. Sie müssen die Konfigurationsunterschiede mit anderen Methoden verwalten (Web Deployment-Projekte, Build-Aufgaben usw.)
John Sheehan
210

Wenn Sie eine Datei mit dem Namen app_offline.htm im Stammverzeichnis eines Webanwendungsverzeichnisses ablegen, fährt ASP.NET 2.0+ die Anwendung herunter und beendet die normale Verarbeitung neuer eingehender Anforderungen für diese Anwendung, wobei nur der Inhalt von app_offline.htm angezeigt wird Datei für alle neuen Anfragen .

Dies ist die schnellste und einfachste Möglichkeit, die Meldung "Site vorübergehend nicht verfügbar" anzuzeigen, während Änderungen auf einem Produktionsserver erneut bereitgestellt (oder zurückgesetzt) ​​werden.

Stellen Sie außerdem, wie von marxidad hervorgehoben , sicher, dass die Datei mindestens 512 Byte Inhalt enthält, damit IE6 sie korrekt wiedergibt .

Troy DeMonbreun
quelle
10
Vergessen Sie nicht die Problemumgehung für die "freundlichen" Nachrichten des IE: tinyurl.com/app-offline-friendly
Mark Cidade
1
Autsch! Seien Sie vorsichtig, wenn Sie dies mit MOSS 2007 verwenden. Es funktioniert nur für Seiten, auf die seit dem letzten IIS-Neustart zugegriffen wurde. Wenn Sie diese Seite also zu Ihrem virtuellen wss-Stammverzeichnis hinzufügen und dann versuchen, eine Seite zu öffnen, auf die zuvor noch nicht zugegriffen wurde, erhalten Sie eine 404.
Marc
1
@Marc - Ich habe diesen Tipp von Scott Guthrie erhalten. Wenn Sie sich großzügig fühlen, würden Sie vielen SharePoint-Entwicklern helfen, dieses Szenario zu vermeiden, wenn Sie den Artikel des Gu kommentieren: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun
Außerdem wird dadurch ein Recycling der App-Domäne ausgelöst und alle offenen Datenbankverbindungen werden geschlossen, nachdem alle Anforderungen abgeschlossen wurden.
Bart Verkoeijen
Dies hat eine Einschränkung: IIS gibt den Inhalt von app_offline.htm mit einem HTTP-Statuscode von 404 zurück. Sollte eine Suchmaschine in diesem Offline-Modus versuchen, Ihre Site zu indizieren, werden Sie die Ergebnisse möglicherweise nicht schätzen. Aber es funktioniert hervorragend für meine private Unternehmens-Web-App!
Larry Silverman
119
throw new HttpException(404, "Article not found");

Dies wird von ASP.NET abgefangen, das die Seite customErrors zurückgibt. Erfahren Sie mehr darüber in einem kürzlich veröffentlichten .NET-Tipp des Tages

John Sheehan
quelle
Einige Entwickler könnten argumentieren, dass es besser ist, Dinge manuell in HttpContext.Response zu packen, als eine Ausnahme auszulösen, die in .NET-Büchern ziemlich teuer ist.
Lubos Hasko
Ist das nicht eine schlechte Form? Sie zeigen den 404-Fehler an, während Sie einen Fehler / eine Ausnahme anzeigen möchten.
Donnie Thomas
1
Ein Fall, an den ich denken kann, ist, wenn jemand böswillig mit Parametern herumspielt und etwas Ungültiges einfügt, möchten Sie wahrscheinlich einen generischen 404, keinen bestimmten Fehler.
John Sheehan
3
Nur weil ich jetzt die .NET Tip of the Day-Site kenne.
Kon
es funktioniert nur, wenn Sie es in httpModule oder httpHandler
Khaled Musaied
75

Hier ist der beste. Fügen Sie dies Ihrer web.config hinzu, um VIEL schneller zu kompilieren. Dies ist Post 3.5SP1 über dieses QFE .

<compilation optimizeCompilations="true">

Kurzzusammenfassung: Wir führen in ASP.NET einen neuen OptimizeCompilations-Switch ein, der in einigen Szenarien die Kompilierungsgeschwindigkeit erheblich verbessern kann. Es gibt einige Fänge, lesen Sie also weiter für weitere Details. Dieser Switch ist derzeit als QFE für 3.5SP1 verfügbar und wird Teil von VS 2010 sein.

Das ASP.NET-Kompilierungssystem verfolgt einen sehr konservativen Ansatz, der dazu führt, dass frühere Arbeiten gelöscht werden, die bei jeder Änderung einer Datei der obersten Ebene ausgeführt wurden. 'Top Level'-Dateien enthalten alles in bin und App_Code sowie global.asax. Während dies für kleine Apps gut funktioniert, wird es für sehr große Apps nahezu unbrauchbar. Beispielsweise stieß ein Kunde auf einen Fall, in dem das Aktualisieren einer Seite 10 Minuten dauerte, nachdem Änderungen an einer "Bin" -Baugruppe vorgenommen wurden.

Um die Schmerzen zu lindern, haben wir einen "optimierten" Kompilierungsmodus hinzugefügt, der einen viel weniger konservativen Ansatz für die Neukompilierung verfolgt.

Über hier :

Scott Hanselman
quelle
6
Ist dies bei VS 2010 "standardmäßig aktiviert" oder sollte ich es trotzdem ausprobieren?
M4N
73
  • Mit HttpContext.Current erhalten Sie immer Zugriff auf die Anforderung / Antwort / etc. Des aktuellen Kontexts, auch wenn Sie keinen Zugriff auf die Eigenschaften der Seite haben (z. B. von einer lose gekoppelten Hilfsklasse).

  • Sie können die Ausführung von Code auf derselben Seite fortsetzen, nachdem Sie den Benutzer auf eine andere Seite umgeleitet haben, indem Sie Response.Redirect ( url , false ) aufrufen.

  • Sie benötigen keine ASPX- Dateien, wenn Sie nur eine kompilierte Seite (oder einen IHttpHandler ) benötigen . Stellen Sie einfach den Pfad und die HTTP-Methoden so ein, dass sie auf die Klasse im <httpHandlers>Element in der Datei web.config verweisen.

  • Ein Page- Objekt kann programmgesteuert aus einer ASPX- Datei abgerufen werden, indem PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context) aufgerufen wird.

Mark Cidade
quelle
Über Response.Redirect (url, false) - Das ist so viel, was ich mir lange erhofft habe. Ich weiß nicht, wie ich das verpasst habe, aber thanxxx
Subliminal Hash
1
Kann jemand erklären, was Sie damit machen würden? Ich weiß, dass es einen gewissen Wert hat, aber ich kann nicht herausfinden, warum ...
Deane
5
Wenn Sie den Benutzer an eine andere Adresse umleiten möchten, aber noch eine Back-End-Verarbeitung durchführen müssen (z. B. eine Berichterstellungsanforderung, die zur Generierungsstatusseite des Berichts umleitet, während der Bericht weiterhin im Hintergrund generiert wird)
Markieren Sie Cidade
Kann jemand eine nützliche Situation für PageParser.GetCompiledPageInstance (..) erklären? In den Dokumenten wird angegeben, dass es für die Verwendung in der Infrastruktur bestimmt ist. Es gibt einen IHttpHandler-Typ zurück, sodass ich nicht sehe, wie es praktisch verwendet werden kann.
John K
@jdk: Ich habe es in der Vergangenheit verwendet, als ich den Standardhandler für * .aspx-Anforderungen überschrieben habe, damit ich dynamische speicherinterne IHttpHandler-Objekte verwenden kann, aber auch GetCompiledPageInstance () für physische * .aspx-Dateien verwenden kann.
Mark Cidade
70

Einzelhandelsmodus auf der Ebene machine.config:

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

Überschreibt die Einstellungen von web.config, um das Debuggen auf false zu erzwingen, aktiviert benutzerdefinierte Fehler und deaktiviert die Ablaufverfolgung. Vergessen Sie nicht mehr, Attribute vor dem Veröffentlichen zu ändern. Lassen Sie sie einfach alle für Entwicklungs- oder Testumgebungen konfiguriert und aktualisieren Sie die Einstellungen für den Produktionseinzelhandel.

Troy Hunt
quelle
1
Manchmal vergesse ich, das Kompilierungs-Debug vor dem Veröffentlichen in false zu ändern, was sich negativ auf die Leistung auswirkt. Kein Problem mehr!
Roy Tinker
59

Aktivieren von Intellisense für MasterPages auf den Inhaltsseiten
Ich bin sicher, dass dies ein sehr wenig bekannter Hack ist

In den meisten Fällen müssen Sie die findcontrol-Methode verwenden und die Steuerelemente auf der Masterseite von den Inhaltsseiten umwandeln, wenn Sie sie verwenden möchten. Die MasterType- Direktive aktiviert Intellisense in Visual Studio, sobald Sie dies tun

Fügen Sie der Seite einfach eine weitere Anweisung hinzu

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

Wenn Sie den virtuellen Pfad nicht verwenden möchten und stattdessen den Klassennamen verwenden möchten

<%@ MasterType TypeName="MyMainMasterPage" %>

Den vollständigen Artikel finden Sie hier

Binoj Antony
quelle
Die Verwendung von FindControl kann manchmal hektisch sein, danke für diesen tollen Tipp!
Alexandre Brisebois
4
Die Verwendung kann zu unerwartetem Verhalten führen. Siehe stackoverflow.com/questions/1998931/…
citronas
Persönlich denke ich, dass die Funktion den Leuten unbekannt bleiben sollte, sie koppelt die Seite mit der Masterseite. Wenn Sie am Ende die Eigenschaften / Methoden der Masterseite verwenden und dann die Masterseite ändern, kommt es zu einem Wartungsalptraum.
Phill
@Phil: Manchmal wird es benötigt und ein statisch typisierter Zugriff auf eine Masterseite ist viel besser als der FindControl-Ansatz. Zumindest erhalten Sie die Compilermeldung und können diese schnell beheben.
Durden81
58

HttpContext.Items als Caching-Tool auf Anforderungsebene

John Sheehan
quelle
2
Dies sollte auch mein Punkt sein, ich verwende dies in verschachtelten Controllern, um Informationen auf Anforderungsebene zu übergeben / zu empfangen. Ich verwende dies auch in MVC, um eine Liste der anzuhängenden JS-Dateien zu speichern, basierend auf Teilansichten.
Tracker1
1
Ich verwende dies, wenn ich das asp.net-Routing verwende, um die von den URLs abgerufenen Parameter an meine Seiten zu übergeben. (nicht mit MVC) ideal zum Umschreiben von URLs und sehr flexibel.
Alexandre Brisebois
Hmmmm, ich dachte nur an einen Ort, an dem ich dies anstelle von Session - ta hätte verwenden können!
Mike Kingscott
52

Zwei Dinge fallen mir auf:

1) Sie können Trace über den Code ein- und ausschalten:

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

2) Sie können mehrere ASPX-Seiten mit nur einer gemeinsam genutzten "CodeBehind" -Datei erstellen.

Erstellen Sie eine CS-Datei der Klasse:

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

und dann können Sie eine beliebige Anzahl von .aspx-Seiten haben (nachdem Sie .designer.cs und .cs Code-Behind gelöscht haben, die VS generiert hat):

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

Sie können Steuerelemente in der ASPX haben, die nicht in Klasse 1 angezeigt werden, und umgekehrt. Sie müssen sich jedoch daran erinnern, Ihre Steuerelemente auf Nullen zu überprüfen.

Radu094
quelle
Ich hätte darüber abgestimmt, aber mir gingen die Stimmen aus. Ich werde versuchen, mich daran zu erinnern, zurück zu kommen, um darüber abzustimmen. Ich wusste nicht, dass wir dieselbe Code Behind-Datei für mehrere Seiten haben können. Ich bin mir nicht sicher, wie das funktionieren würde.
Vaibhav
5
Ist jemand der Meinung, dass es ein Sicherheitsrisiko ist, einen Trace von einer URL aus zu aktivieren? (# 1) Ich werde diese Frage nicht ablehnen, aber es ist wichtig, das Risiko dort zu verstehen.
Kevin Goff
5
Absolut, Sie sollten diesen Code wirklich in einen # ifdef DEBUG # endif-Block
einfügen
Tolle Kommentare, die auf den Sicherheitsaspekt hinweisen.
Vaibhav
2
Warum ist es ein Sicherheitsrisiko, einen Trace von der URL zu aktivieren? Wie kann es verwendet werden, um mir zu schaden?
Kamarey
48

Sie können verwenden:

 Request.Params[Control.UniqueId] 

Um den Wert eines Steuerelements zu erhalten, BEVOR der Ansichtsstatus initialisiert wird (Control.Text usw. ist zu diesem Zeitpunkt leer).

Dies ist nützlich für Code in Init.

FlySwat
quelle
Die Viewstate-Initialisierung wird nicht mit Request.Params behandelt. Verwenden Sie es, BEVOR Sie die Methode LoadPostData des Steuerelements IPostBackDataHandler auslösen.
Chapluck
46

WebMethods.

Sie können ASP.NET AJAX-Rückrufe für Webmethoden verwenden, die auf ASPX-Seiten platziert sind. Sie können eine statische Methode mit den Attributen [WebMethod ()] und [ScriptMethod ()] dekorieren. Beispielsweise:

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

Jetzt können Sie auf Ihrer ASPX-Seite Folgendes tun:

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

Rufen Sie Ihre serverseitige Methode über JavaScript auf, indem Sie Folgendes verwenden:

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

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

Überprüfen Sie, ob der Client noch verbunden ist, bevor Sie eine lang laufende Aufgabe starten:

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

Eine wenig bekannte und selten verwendete Funktion von ASP.NET ist:

Tag-Zuordnung

Es wird selten verwendet, weil es nur eine bestimmte Situation gibt, in der Sie es brauchen würden, aber wenn Sie es brauchen, ist es so praktisch.

Einige Artikel über diese wenig bekannte Funktion:

Tag-Zuordnung in ASP.NET
Verwenden der Tag-Zuordnung in ASP.NET 2.0

und aus diesem letzten Artikel:

Mit der Tag-Zuordnung können Sie kompatible Steuerelemente zur Kompilierungszeit auf jeder Seite Ihrer Webanwendung austauschen. Ein nützliches Beispiel ist, wenn Sie über ein Standard-ASP.NET-Steuerelement verfügen, z. B. eine DropDownList, und dieses durch ein benutzerdefiniertes Steuerelement ersetzen möchten, das von DropDownList abgeleitet ist. Dies könnte ein Steuerelement sein, das angepasst wurde, um ein optimierteres Caching von Suchdaten zu ermöglichen. Anstatt jedes Webformular zu bearbeiten und die integrierten DropDownLists durch Ihre benutzerdefinierte Version zu ersetzen, können Sie ASP.NET tatsächlich für Sie ausführen lassen, indem Sie web.config ändern:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>
CraigTP
quelle
Dies wäre sehr verwirrend für andere Entwickler in Ihrem Team
Aykut Akıncı
1
@ Aykut - In der Tat könnte es sein, weshalb ich feststelle, dass seine Nützlichkeit eher eng ist, aber bei Bedarf ist es sehr praktisch. Außerdem würde ich sicherstellen, dass jede Verwendung von Tag Mapping sehr klar dokumentiert ist, um Verwirrung und Unklarheiten zu vermeiden.
CraigTP
43

HttpModules . Die Architektur ist verrückt elegant. Vielleicht keine versteckte Funktion, aber trotzdem cool.

Allain Lalonde
quelle
3
HttpModules ist etwas, das fortgeschritten ist, aber ich würde es nicht selten oder weniger gebraucht nennen (oder mich naiv nennen). Aber ja, ich liebe die Architektur.
Vaibhav
+1, da viele erfahrene Entwickler vielleicht etwas über HttpModules wissen, aber ihre Beziehung zu Anfragen nicht vollständig verstehen. (Gleiches gilt für HttpHandlers)
John Bubriski
34

Sie können ASP.NET-Kommentare auf einer ASPX-Seite verwenden, um vollständige Teile einer Seite einschließlich Serversteuerelementen zu kommentieren. Und der auskommentierte Inhalt wird niemals an den Kunden gesendet.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Chris Pietschmann
quelle
5
Es gibt Leute, die wirklich nicht wissen, dass es Kommentare gibt?
Joe Phillips
7
Ich mag es, wenn Sie eine halbe Aspx-Seite in <! - Kommentare ...
Bryan Rehbein
Es ist ziemlich nackte Funktion von ASP.NET
Rafek
34

Der Code Expression Builder

Beispiel-Markup:

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

Das Schöne am Code Expression Builder ist, dass Sie datenbindungsähnliche Ausdrücke in Situationen ohne Datenbindung verwenden können. Sie können auch andere Ausdrucksgeneratoren erstellen, die andere Funktionen ausführen.

web.config:

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

Die cs-Klasse, die alles möglich macht:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 
andleer
quelle
1
Was meinst du mit "und anderen" im Titel?
Khaled Musaied
Nun, ich glaube, ich bin nie zu den anderen gekommen.
andleer
2
+1, wirklich cooles Feature ... Das ist eigentlich ziemlich ähnlich zu den Markup-Erweiterungen von WPF
Thomas Levesque
Ist das nicht dasselbe wie mit <%= /*code*/ %>?
Bevacqua
33

Verwendung des ASHX-Dateityps:
Wenn Sie nur einige grundlegende HTML- oder XML- Dateien ausgeben möchten, ohne die Seitenereignishandler zu durchlaufen, können Sie das HttpModule auf einfache Weise implementieren

Nennen Sie die Seite SomeHandlerPage.ashx und geben Sie einfach den folgenden Code (nur eine Zeile) ein

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

Dann die Codedatei

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; }
        }
    }
}
Binoj Antony
quelle
5
Es ist erwähnenswert, dass Sie IRequiresSessionState oder IReadOnlySessionState hinzufügen sollten, wenn Sie es benötigen, da es sonst nicht vorhanden ist.
Tracker1
3
Es ist auch erwähnenswert, dass Sie das Setup des Handlers in der web.config angeben können, damit keine physische Ashx-Datei herumliegen muss. Oder Sie können den Handler programmgesteuert in Ihrem Anwendungsstart im globalen Asax registrieren.
Phill
27

Festlegen der Serversteuerungseigenschaften basierend auf dem Zielbrowser und mehr .

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

Das hat mich irgendwie überrascht.

Omer van Kloeten
quelle
1
+1. Können Sie ein kurzes Codebeispiel inline posten? Ich denke, es wird mehr Aufmerksamkeit und positive Stimmen erzeugen. Ich möchte, dass dieser steigt.
John K
26

Ich habe an einer asp.net-Anwendung gearbeitet, die eine Sicherheitsüberprüfung durch ein führendes Sicherheitsunternehmen durchlaufen hat, und diesen einfachen Trick gelernt, um eine weniger bekannte, aber wichtige Sicherheitslücke zu verhindern.

Die folgende Erklärung stammt von: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Erwägen Sie die Verwendung von Page.ViewStateUserKey, um Ein-Klick-Angriffen entgegenzuwirken. Wenn Sie Ihre Anrufer authentifizieren und ViewState verwenden, legen Sie die Page.ViewStateUserKey-Eigenschaft im Page_Init-Ereignishandler fest, um Angriffe mit einem Klick zu verhindern.

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

Setzen Sie die Eigenschaft auf einen Wert, von dem Sie wissen, dass er für jeden Benutzer eindeutig ist, z. B. eine Sitzungs-ID, einen Benutzernamen oder eine Benutzer-ID.

Ein Ein-Klick-Angriff tritt auf, wenn ein Angreifer eine Webseite (.htm oder .aspx) erstellt, die ein verstecktes Formularfeld mit dem Namen __VIEWSTATE enthält, das bereits mit ViewState-Daten gefüllt ist. Der ViewState kann aus einer Seite generiert werden, die der Angreifer zuvor erstellt hat, z. B. einer Warenkorbseite mit 100 Artikeln. Der Angreifer lockt einen ahnungslosen Benutzer zum Surfen auf die Seite, und dann veranlasst der Angreifer, dass die Seite an den Server gesendet wird, auf dem der ViewState gültig ist. Der Server kann nicht erkennen, dass der ViewState vom Angreifer stammt. ViewState-Validierung und HMACs wirken diesem Angriff nicht entgegen, da ViewState gültig ist und die Seite im Sicherheitskontext des Benutzers ausgeführt wird.

Durch Festlegen der ViewStateUserKey-Eigenschaft wird die Eigenschaft beim Navigieren des Angreifers zu einer Seite zum Erstellen des ViewState auf seinen Namen initialisiert. Wenn der legitime Benutzer die Seite an den Server sendet, wird sie mit dem Namen des Angreifers initialisiert. Infolgedessen schlägt die ViewState HMAC-Prüfung fehl und es wird eine Ausnahme generiert.

Craig McKeachie
quelle
2
Denken Sie auch daran, base.OnInit (e) zu verlassen. damit die Funktion Page_Init () ihre Arbeit erledigt.
Druide
Ich denke, dass dieser Trick fehlschlagen kann, wenn ein echter Benutzer keine Cookies akzeptiert hat oder wenn die Sitzungs-ID eine Zeitüberschreitung hat.
Aristos
1
Sie brauchen nicht, base.OnInit(e);wenn Sie AutoEventWireup="true"für die Seite verwenden.
Adam Nofsinger
1
Druide: Er überschreibt OnInit nicht (in diesem Fall wäre base.OnInit (e) notwendig).
Crdx
Die Verwendung der Sitzungs-ID für den ViewStateUserKey funktioniert nur, nachdem eine Sitzung tatsächlich gestartet wurde. Dies bedeutet auch, dass diese Seiten nach Ablauf der Sitzung eine Zeitüberschreitung aufweisen können. In Fällen, in denen diese Probleme ein Problem darstellen, können Sie eine dauerhaftere Methode in Betracht ziehen, z. B. die IP-Adresse des Benutzers.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Dies ist ideal, um zu bestimmen, welche Skripte ausgegeben werden sollen (Min- oder Vollversion) oder was Sie sonst noch in dev wollen, aber nicht live.

John Sheehan
quelle
Ich stimme Jan zu, aber manchmal kann es interessant sein, eine App zu haben, die den Ausführungsstatus Debug / Release kennt.
Alexandre Brisebois
20

In ASP.NET 3.5 SP1 enthalten:

  • customErrors unterstützt jetzt das Attribut "redirectMode" mit dem Wert "ResponseRewrite". Zeigt die Fehlerseite an, ohne die URL zu ändern.
  • Das Formular-Tag erkennt jetzt das Aktionsattribut. Ideal für das Umschreiben von URLs
John Sheehan
quelle
20

DefaultButton- Eigenschaft in Panels.

Hiermit wird die Standardschaltfläche für ein bestimmtes Bedienfeld festgelegt.

MRG
quelle
1
Achtung, funktioniert nicht bei allen Arten von Schaltflächen, z. B. LinkButtons!
Kovu
19

Verwenden von configSource zum Teilen von Konfigurationsdateien.

Sie können das configSource-Attribut in einer web.config-Datei verwenden, um Konfigurationselemente in andere .config-Dateien zu übertragen, z.

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

... können Sie den gesamten Abschnitt appSettings in einer anderen Konfigurationsdatei speichern. Hier ist das Neue web.config:

    <appSettings configSource="myAppSettings.config" />

Die myAppSettings.configDatei:

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

Dies ist sehr nützlich für Szenarien, in denen Sie eine Anwendung für einen Kunden bereitstellen und nicht möchten, dass dieser die Datei web.config selbst stört und nur einige Einstellungen ändern kann.

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

Ryan Shripat
quelle
1
Dies funktioniert auch bei allen Arten von .net-Projekten, z. B. bei Desktop-Apps. configs
Zoltan Veres
17

MaintainScrollPositionOnPostback- Attribut in der Page-Direktive. Es wird verwendet, um die Bildlaufposition der Aspx-Seite über Postbacks hinweg beizubehalten.

MRG
quelle
1
Ein Kommentar wäre hilfreich, um die Antwort zu verbessern.
MRG
16

HttpContext.IsCustomErrorEnabled ist eine coole Funktion. Ich habe sie mehr als einmal nützlich gefunden. Hier ist ein kurzer Beitrag darüber.

Kilhoffer
quelle
16

Standardmäßig wird jeder Inhalt zwischen Tags für ein benutzerdefiniertes Steuerelement als untergeordnetes Steuerelement hinzugefügt. Dies kann in einer AddParsedSubObject () - Überschreibung zum Filtern oder zusätzlichen Parsen (z. B. von Textinhalten in LiteralControls) abgefangen werden:

    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>
Mark Cidade
quelle
13

Wenn ASP.NET einen RSS-Feed generiert, wird manchmal eine zusätzliche Zeile oben auf der Seite eingefügt. Dies wird mit gängigen RSS-Validatoren nicht überprüft. Sie können dies umgehen, indem Sie die Seitenanweisung <@Page>am Ende der Seite einfügen.

Kevin Goff
quelle
7
Würden Sie nicht besser einen .ASHX-Handler zum Generieren von RSS-Feeds verwenden?
Dan Diplo
Ich denke, das hängt von der Komplexität des Projekts ab. Nicht jeder hat die Fähigkeit oder die Fähigkeiten, Handler zu erstellen und zu kompilieren. Auf Seite asp.net funktioniert einigermaßen gut dafür
Kevin Goff
1
Und Sie können so etwas wie <asp: Repeater> verwenden, um RSS-Elemente zu generieren und andere Tricks auszuführen (z. B. die Verwendung von LogInView, um einige Elemente zu entfernen), was viel besser ist als das Schreiben von Zeichenfolgen aus ASHX IMO
chakrit
LinqToXml + ASHX ist der richtige Weg!
Carlos Muñoz
Dies ist viel mehr als nur für die Generierung von RSS-Feeds nützlich. IIRC, HTML5 muss das <! Doctype html> -Tag in der ersten Zeile oben haben, um korrekt zu validieren.
Roy Tinker
12

Bevor ASP.NET v3.5 Routen hinzufügte, konnten Sie Ihre eigenen benutzerfreundlichen URLs erstellen, indem Sie einfach ein HTTP-Modul in die Anforderung schreiben und diese früh in der Seitenpipeline neu schreiben (wie das BeginRequest-Ereignis).

URLs wie http: // Servername / Seite / Param1 / SomeParams1 / Param2 / SomeParams2 werden einer anderen Seite wie unten zugeordnet (häufig mit regulären Ausdrücken).

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

DotNetNuke hat ein wirklich gutes HttpModule, das dies für ihre freundlichen URLs tut. Ist immer noch nützlich für Computer, auf denen Sie .NET v3.5 nicht bereitstellen können.

Tyler
quelle
Dies erfordert die Zuordnung aller IIS-Anforderungen zu ASP.NET
John Sheehan
Oder nur der 404-Fehlerbehandler.
FlySwat