Funzionalità nascoste di ASP.NET

Questa domanda esiste perché ha un significato storico, ma non è considerata una buona domanda per questo sito, quindi per favore non usarla come prova per poter fare domande simili qui.

Maggiori informazioni: https://stackoverflow.com/faq


Ci sono sempre caratteristiche che potrebbero essere utili in scenari marginali, ma proprio per questo la maggior parte delle persone non li conosce. Sto chiedendo funzionalità che in genere non vengono insegnate dai libri di testo.

Quali sono quelli che conosci?

Durante il test, è ansible inviare e-mail a una cartella sul computer anziché a un server SMTP. Metti questo nel tuo web.config:

       

Se si posiziona un file denominato app_offline.htm nella directory principale di una directory di applicazioni Web, ASP.NET 2.0+ interromperà l’applicazione e interromperà l’elaborazione normale delle nuove richieste in entrata per tale applicazione, mostrando solo i contenuti di app_offline.htm file per tutte le nuove richieste .

Questo è il modo più rapido e semplice per visualizzare la notifica “Sito temporaneamente non disponibile” durante la ridistribuzione (o il rollback) delle modifiche a un server di produzione.

Inoltre, come sottolineato da marxidad , assicurati di avere almeno 512 byte di contenuto all’interno del file, quindi IE6 lo renderà correttamente.

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

Questo verrà catturato da ASP.NET che restituirà la pagina CustomErrors. Approfondito su questo in una recente recensione di Tip of the Day

Ecco il migliore. Aggiungi questo al tuo web.config per una compilazione MUCH più veloce. Questo è post 3.5SP1 tramite questo QFE .

  

Riepilogo rapido: stiamo introducendo una nuova opzione optimizeCompilations in ASP.NET che può migliorare notevolmente la velocità di compilazione in alcuni scenari. Ci sono alcune catture, quindi continuate a leggere per maggiori dettagli. Questo switch è attualmente disponibile come QFE per 3.5SP1 e farà parte di VS 2010.

Il sistema di compilazione ASP.NET adotta un approccio molto conservativo che fa sì che cancelli qualsiasi lavoro precedente che abbia mai fatto in un momento in cui un file di “livello superiore” cambia. I file ‘di primo livello’ includono qualsiasi cosa in bin e App_Code, oltre a global.asax. Anche se questo funziona bene per le piccole app, diventa quasi inutilizzabile per le app di grandi dimensioni. Ad esempio, un cliente stava imbattendosi in un caso in cui ci sono voluti 10 minuti per aggiornare una pagina dopo aver apportato modifiche a un assieme “bin”.

Per alleviare il dolore, abbiamo aggiunto una modalità di compilazione “ottimizzata” che richiede un approccio molto meno conservativo alla ricompilazione.

Via qui :

  • HttpContext.Current ti darà sempre accesso alla richiesta / risposta / ecc. Del contesto corrente, anche quando non hai accesso alle proprietà della Pagina (ad esempio, da una class helper con accoppiamento limitato).

  • Puoi continuare ad eseguire il codice sulla stessa pagina dopo aver reindirizzato l’utente a un altro chiamando Response.Redirect ( url , false )

  • Non hai bisogno di file .ASPX se tutto ciò che vuoi è una pagina compilata (o qualsiasi IHttpHandler ). Basta impostare il percorso e i metodi HTTP per puntare alla class nell’elemento nel file web.config.

  • Un object Page può essere richiamato da un file .ASPX a livello di codice chiamando PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)

Modalità di vendita al livello machine.config:

      

Sovrascrive le impostazioni di web.config per applicare il debug a false, triggers gli errori personalizzati e disabilita la traccia. Non dimenticando più di cambiare gli attributi prima della pubblicazione, basta lasciarli tutti configurati per gli ambienti di sviluppo o test e aggiornare le impostazioni di vendita al dettaglio.

Abilitazione intellisense per MasterPages nelle pagine di contenuto
Sono sicuro che questo è un trucco molto poco conosciuto

La maggior parte delle volte devi usare il metodo findcontrol e lanciare i controlli nella pagina principale dalle pagine di contenuto quando vuoi usarli, la direttiva MasterType abiliterà intellisense in visual studio una volta che sarai a questo

basta aggiungere un’altra direttiva alla pagina

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

Se non si desidera utilizzare il percorso virtuale e utilizzare il nome della class invece di

 <%@ MasterType TypeName="MyMainMasterPage" %> 

Leggi l’articolo completo qui

HttpContext.Items come strumento di caching a livello di richiesta

Due cose spiccano nella mia testa:

1) Puoi triggersre e distriggersre Trace dal codice:

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

2) È ansible creare più pagine .aspx utilizzando solo un file “code-behind” condiviso.

Crea un file .cs di class:

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

e quindi puoi avere un numero qualsiasi di pagine .aspx (dopo aver eliminato .designer.cs e .cs code-behind che VS ha generato):

  <%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.Class1" %> 

È ansible avere controlli nell’ASPX che non compaiono in Class1 e viceversa, ma è necessario ricordare per controllare i controlli per i null.

Puoi usare:

  Request.Params[Control.UniqueId] 

Per ottenere il valore di un controllo PRIMA il viewstate viene inizializzato (Control.Text ecc sarà vuoto a questo punto).

Questo è utile per il codice in Init.

WebMethods.

È ansible utilizzare i callback di ASP.NET AJAX ai metodi Web posizionati nelle pagine ASPX. È ansible decorare un metodo statico con gli attributi [WebMethod ()] e [ScriptMethod ()]. Per esempio:

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

Ora, nella tua pagina ASPX puoi farlo:

 

E chiama il tuo metodo lato server tramite JavaScript usando:

   

Verifica se il client è ancora connesso, prima di iniziare un’attività di lunga durata:

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

Una caratteristica poco conosciuta e utilizzata raramente di ASP.NET è:

Mappatura dei tag

È usato raramente perché c’è solo una situazione specifica in cui ne avresti bisogno, ma quando ne hai bisogno, è così a portata di mano.

Alcuni articoli su questa caratteristica poco conosciuta:

Mappatura tag in ASP.NET
Utilizzo della mapping tag in ASP.NET 2.0

e da quest’ultimo articolo:

La mapping dei tag consente di scambiare i controlli compatibili in fase di compilazione in ogni pagina dell’applicazione Web. Un esempio utile è se si dispone di un controllo ASP.NET predefinito, ad esempio DropDownList, e si desidera sostituirlo con un controllo personalizzato derivato da DropDownList. Potrebbe trattarsi di un controllo personalizzato per fornire un caching più ottimizzato dei dati di ricerca. Invece di modificare ogni modulo Web e sostituire i DropDownList incorporati con la tua versione personalizzata, puoi fare in modo che ASP.NET lo faccia automaticamente modificando web.config:

       

HttpModules . L’architettura è pazzesca elegante. Forse non è una funzionalità nascosta, ma non per questo meno bella.

È ansible utilizzare i commenti ASP.NET all’interno di una pagina .aspx per commentare le parti complete di una pagina, inclusi i controlli del server. E i contenuti che vengono commentati non verranno mai inviati al client.

 <%-- 
--%>

The Code Expression Builder

Campione di esempio:

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

La vera bellezza del generatore di espressioni di codice è che è ansible utilizzare le espressioni di tipo databinding in situazioni non-database. È anche ansible creare altri costruttori di espressioni che eseguono altre funzioni.

web.config:

     

La class cs che fa accadere tutto:

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

Utilizzo del tipo di file ASHX:
Se vuoi semplicemente emettere alcuni html o xml di base senza passare attraverso i gestori di eventi della pagina, allora puoi implementare HttpModule in modo semplice

Assegna un nome alla pagina come SomeHandlerPage.ashx e inserisci semplicemente il codice seguente (solo una riga)

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

Quindi il file di codice

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

Impostazione delle proprietà del controllo server in base al browser di destinazione e altro .

  

Questo mi ha colto di sorpresa.

System.Web.VirtualPathUtility

Ho lavorato su un’applicazione asp.net che è stata sottoposta a un controllo di sicurezza da una società di sicurezza leader e ho imparato questo facile trucco per evitare una vulnerabilità di sicurezza meno nota ma importante.

La seguente spiegazione è tratta da: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Potresti utilizzare Page.ViewStateUserKey per contrastare gli attacchi con un clic. Se si autenticano i chiamanti e si utilizza ViewState, impostare la proprietà Page.ViewStateUserKey nel gestore eventi Page_Init per impedire attacchi con un clic.

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

Imposta la proprietà su un valore che tu sai essere univoco per ciascun utente, ad esempio un ID di sessione, un nome utente o un identificativo utente.

Un attacco con un clic si verifica quando un utente malintenzionato crea una pagina Web (.htm o .aspx) che contiene un campo modulo nascosto denominato __VIEWSTATE già riempito con i dati ViewState. Il ViewState può essere generato da una pagina creata precedentemente dall’utente malintenzionato, ad esempio una pagina del carrello degli acquisti con 100 elementi. L’utente malintenzionato attira un utente ignaro nella navigazione verso la pagina, quindi l’autore dell’attacco fa sì che la pagina venga inviata al server in cui è valido ViewState. Il server non ha modo di sapere che il ViewState è originato dall’attaccante. La convalida di ViewState e gli HMAC non contrastano questo attacco perché ViewState è valido e la pagina viene eseguita nel contesto di sicurezza dell’utente.

Impostando la proprietà ViewStateUserKey, quando l’utente malintenzionato accede a una pagina per creare ViewState, la proprietà viene inizializzata sul proprio nome. Quando l’utente legittimo invia la pagina al server, viene inizializzata con il nome dell’aggressore. Di conseguenza, il controllo HStac di ViewState fallisce e viene generata un’eccezione.

HttpContext.Current.IsDebuggingEnabled

Questo è ottimo per determinare quali script devono essere esportati (versioni minime o complete) o qualsiasi altra cosa si possa desiderare in dev, ma non dal vivo.

Incluso in ASP.NET 3.5 SP1:

  • customErrors ora supporta l’attributo “redirectMode” con un valore di “ResponseRewrite”. Mostra la pagina di errore senza modificare l’URL.
  • Il tag form ora riconosce l’attributo action. Ottimo per quando stai usando la riscrittura degli URL

Proprietà DefaultButton in Pannelli.

Imposta il pulsante predefinito per un pannello particolare.

Utilizzo di configSource per dividere i file di configurazione.

È ansible utilizzare l’attributo configSource in un file web.config per trasferire elementi di configurazione in altri file .config, ad esempio, anziché:

      

… puoi avere l’intera sezione appSettings memorizzata in un altro file di configurazione. Ecco il nuovo web.config :

   

Il file myAppSettings.config :

      

Questo è abbastanza utile per gli scenari in cui si distribuisce un’applicazione a un cliente e non si desidera che interferiscano con il file web.config stesso e si desideri semplicemente che siano in grado di modificare solo alcune impostazioni.

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

Attributo MaintainScrollPositionOnPostback nella direttiva Page. Viene utilizzato per mantenere la posizione di scorrimento della pagina di aspx attraverso i postback.

HttpContext.IsCustomErrorEnabled è una funzionalità interessante. L’ho trovato utile più di una volta. Ecco un breve post su di esso.

Per impostazione predefinita, qualsiasi contenuto tra i tag per un controllo personalizzato viene aggiunto come controllo figlio. Questo può essere intercettato in una sovrascrittura di AddParsedSubObject () per il filtraggio o un’analisi aggiuntiva (ad es. Del contenuto di testo in LiteralControls):

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

   ...this text is parsed as a LiteralControl...  

Se ASP.NET genera un feed RSS, a volte inserisce una riga aggiuntiva nella parte superiore della pagina. Questo non verrà convalidato con i comuni validatori RSS. Puoi aggirare il problema inserendo la direttiva di pagina <@Page> nella parte inferiore della pagina.

Prima che ASP.NET v3.5 aggiungesse percorsi, potresti creare i tuoi URL amichevoli semplicemente scrivendo un HTTPModule e riscrivere la richiesta all’inizio della pipeline della pagina (come l’evento BeginRequest).

URL come http: // servername / page / Param1 / SomeParams1 / Param2 / SomeParams2 verrebbero mappati su un’altra pagina come in basso (spesso usando espressioni regolari).

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

DotNetNuke ha un HttpModule veramente buono che fa questo per i loro URL amichevoli. È ancora utile per le macchine in cui non è ansible distribuire .NET v3.5.