Funzioni nascoste di ASP.NET [chiuso]


292

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

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


Ci sono sempre caratteristiche che sarebbero utili in scenari marginali, ma proprio per questo la maggior parte delle persone non le conosce. Chiedo funzioni che in genere non sono insegnate dai libri di testo.

Quali sono quelli che conosci?


Bella domanda, vorrei poter votare più volte!
Gavin Miller,

1
Concordato. Adoro le discussioni come questa. C'è così tanta profondità nella struttura, che a volte ti stupisci di cose che non sapevi che fossero lì.
Deane,

Sto imparando così tanti nuovi trucchi interessanti dalle risposte in questo thread - grazie! :)
Maxim Zaslavsky,

16
Invece di "Funzionalità nascoste di ..", queste cose non dovrebbero essere chiamate "Funzionalità poco conosciute di ..." perché la maggior parte delle risposte è ben documentata in MSDN o altrove, semplicemente non comunemente conosciute o utilizzate.
John K,

Vedi meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… e i relativi post Meta per la discussione sull'adeguatezza e la chiusura.

Risposte:


335

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

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

6
Veramente? Stavo per installare un server SMTP falso, come Dumbster. Ho nascosto gemma.
Eduardo Molteni,

2
Qualcuno sa se è possibile specificare una condivisione UNC per la posizione della directory?
Mark Sherretta,

32
Meglio ancora, inseriscilo nella casella di sviluppo machine.config, in modo da non dover modificare web.config su ogni app che crei.
Max Toro,

Puoi impostarlo in modo che lo faccia solo sull'host locale? In questo modo non devi cambiarlo ogni volta?
chobo2,

Non c'è impostazione per questo. Dovrai gestire le differenze di configurazione usando altri metodi (progetti di distribuzione Web, attività di compilazione, ecc.)
John Sheehan,

210

Se si inserisce un file denominato app_offline.htm nella directory principale di una directory dell'applicazione Web, ASP.NET 2.0+ arresta l'applicazione e interrompe l'elaborazione normale di eventuali nuove richieste in arrivo per tale applicazione, mostrando solo il contenuto di app_offline.htm file per tutte le nuove richieste .

Questo è il modo più rapido e semplice per visualizzare l'avviso "Sito temporaneamente non disponibile" durante la ridistribuzione (o il rollback) delle modifiche su un server di produzione.

Inoltre, come sottolineato da Marxidad , assicurati di avere almeno 512 byte di contenuto all'interno del file in modo che IE6 lo visualizzi correttamente.


10
Non dimenticare la soluzione alternativa per i messaggi "amichevoli" di IE: tinyurl.com/app-offline-friendly
Mark Cidade,

1
Ahia! Fai attenzione quando lo usi con MOSS 2007. Funzionerà solo per le pagine a cui è stato effettuato l'accesso dall'ultimo riavvio di IIS. Quindi, se aggiungi questa pagina alla tua radice virtuale wss, quindi prova ad aprire una pagina a cui non era stato effettuato l'accesso in precedenza, otterrai un 404.
Marc

1
@Marc - Ricevuto questo consiglio da Scott Guthrie, se ti senti generoso, aiuteresti molti sviluppatori di SharePoint a evitare questo scenario se commentassi l'articolo del Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun,

Inoltre, ciò attiverà anche un riciclo del dominio app e la chiusura di tutte le connessioni al database aperte, al termine di tutte le richieste.
Bart Verkoeijen,

C'è un avvertimento in questo: IIS restituisce il contenuto app_offline.htm con un codice di stato HTTP di 404. Se un motore di ricerca vaga e tenta di indicizzare il tuo sito mentre sei in questa modalità offline, potresti non apprezzare i risultati. Ma funziona benissimo per la mia app web aziendale privata!
Larry Silverman,

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

Questo verrà rilevato da ASP.NET che restituirà la pagina customErrors. Scopri questo in un recente post di .NET Tip of the Day


Alcuni sviluppatori potrebbero sostenere che è meglio concludere le cose manualmente in HttpContext.Response piuttosto che lanciare un'eccezione che è un'operazione piuttosto costosa nei libri di .NET.
Lubos Hasko,

Non è questa cattiva forma? Stai visualizzando l'errore 404, mentre desideri visualizzare un errore / un'eccezione.
Donnie Thomas,

1
Un caso a cui riesco a pensare è che se qualcuno sta scherzando maliziosamente con i parametri e inserisce qualcosa di non valido, probabilmente vuoi un 404 generico non un errore specifico.
John Sheehan,

3
Eseguito l'upgrade puramente perché ora sono a conoscenza del sito .NET Tip of the Day.
Kon

funziona solo quando lo si lancia in httpModule o httpHandler
Khaled Musaied il

75

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

<compilation optimizeCompilations="true">

Riepilogo rapido: stiamo introducendo un nuovo switch optimCompilations in ASP.NET che può migliorare notevolmente la velocità di compilazione in alcuni scenari. Ci sono alcune catture, quindi continua 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 gli fa cancellare qualsiasi lavoro precedente che ha fatto ogni volta che cambia un file di "livello superiore". I file "di livello superiore" includono qualsiasi cosa nel bin e App_Code, così come global.asax. Mentre questo funziona bene per le piccole app, diventa quasi inutilizzabile per app molto grandi. Ad esempio, un cliente si è imbattuto 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 adotta un approccio molto meno conservativo alla ricompilazione.

Via qui :


6
È "attivo per impostazione predefinita" con VS 2010 o dovrei ancora provarlo?
M4N,

73
  • 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 classe di supporto liberamente accoppiata).

  • Puoi continuare a 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 desideri è una Pagina compilata (o qualsiasi IHttpHandler ). Basta impostare il percorso e i metodi HTTP in modo che puntino alla classe <httpHandlers>nell'elemento nel file web.config.

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


A proposito di Response.Redirect (url, false) - Questo è quello che speravo da molto tempo .. Non so come mi sono perso ma graziexxx
Subliminal Hash

1
Qualcuno può spiegare cosa faresti con questo? So che ha un certo valore, ma non riesco a capire perché ...
Deane,

5
Se desideri reindirizzare l'utente a un indirizzo diverso ma hai ancora qualche elaborazione back-end da fare (ad esempio, una richiesta di generazione di report che reindirizza alla pagina di stato di generazione del report mentre continua a generare il report in background)
Mark Cidade

Qualcuno può spiegare una situazione utile per PageParser.GetCompiledPageInstance (..)? I documenti dicono che è per l'uso dell'infrastruttura: restituisce un tipo IHttpHandler, quindi non vedo come possa essere praticamente utilizzato.
John K,

@jdk: l'ho usato in passato durante l'override del gestore predefinito per richieste * .aspx in modo da poter usare oggetti IHttpHandler in memoria dinamici ma anche usare GetCompiledPageInstance () per file fisici * .aspx.
Mark Cidade,

70

Modalità di vendita al dettaglio a livello di machine.config:

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

Sostituisce le impostazioni web.config per imporre il debug su false, attiva gli errori personalizzati e disabilita la traccia. Non dimenticare più di modificare gli attributi prima della pubblicazione: lasciali tutti configurati per ambienti di sviluppo o test e aggiorna le impostazioni di vendita al dettaglio di produzione.


1
A volte dimentico di cambiare il debug della compilazione in falso prima della pubblicazione, il che influisce negativamente sulle prestazioni. Nessun problema più!
Roy Tinker,

59

Abilitare intellisense per MasterPages nelle pagine dei contenuti
Sono sicuro che si tratta di un hack poco conosciuto

Il più 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 hai fatto questo

basta aggiungere un'altra direttiva alla pagina

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

Se non si desidera utilizzare il percorso virtuale e utilizzare invece il nome della classe, allora

<%@ MasterType TypeName="MyMainMasterPage" %>

Ottieni l'articolo completo qui


L'uso di FindControl a volte può essere frenetico, grazie per questo fantastico suggerimento!
Alexandre Brisebois,

4
L'utilizzo di questo potrebbe comportare comportamenti imprevisti. Vedere stackoverflow.com/questions/1998931/...
citronas

Personalmente penso che la funzione dovrebbe essere lasciata sconosciuta alle persone, abbina la pagina alla pagina principale. Se finisci per usare le proprietà / i metodi della pagina principale e poi cambi la pagina principale finisci con un incubo di manutenzione.
Phill,

@Phil: A volte è necessario e avere un accesso tipicamente statico a una pagina master è molto meglio dell'approccio FindControl. Almeno ricevi il messaggio del compilatore e puoi risolverlo rapidamente.
Durden81,

58

HttpContext.Items come strumento di memorizzazione nella cache a livello di richiesta


2
Questo sarebbe stato anche il mio punto, lo uso nei controlli nidificati per passare / ricevere informazioni sul livello di richiesta. Lo uso anche in MVC per memorizzare un elenco di file js da aggiungere, basato su viste parziali.
Tracker1,

1
Lo uso quando utilizzo il routing asp.net per passare i parametri recuperati dagli URL alle mie pagine. (non con MVC) ottimo per la riscrittura degli URL ed è abbastanza flessibile.
Alexandre Brisebois,

Hmmmm, ho pensato solo a un posto dove avrei potuto usare questo invece di Session - ta!
Mike Kingscott,

52

Due cose spiccano nella mia testa:

1) È possibile attivare e disattivare la traccia dal codice:

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

2) È possibile creare più pagine aspx utilizzando un solo file "code-behind" condiviso.

Crea un file .cs di classe:

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" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

È possibile avere controlli nell'ASPX che non compaiono in Class1 e viceversa, ma è necessario ricordarsi di controllare i controlli per null.


Lo avrei votato, ma ho esaurito i voti. Proverò a ricordare di tornare a votare. Non sapevo che avremmo potuto avere lo stesso file Code Behind per più pagine. Non sono sicuro di come funzionerebbe.
Vaibhav,

5
Qualcun altro ritiene che sia un rischio per la sicurezza consentirti di attivare una traccia da un URL? (# 1) Non ho intenzione di sottovalutare questa domanda, ma è importante capire il rischio lì.
Kevin Goff,

5
Assolutamente, dovresti davvero mettere quel codice in un blocco #ifdef DEBUG #endif
Radu094

Grandi commenti, sottolineando l'aspetto della sicurezza.
Vaibhav,

2
Perché è un rischio per la sicurezza attivare una traccia dall'URL? Come può essere usato per farmi del male?
Kamarey,

48

Puoi usare:

 Request.Params[Control.UniqueId] 

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

Questo è utile per il codice in Init.


L'inizializzazione di Viewstate non tratta con Request.Params. Usalo PRIMA di aumentare il metodo LoadPostData del controllo implementato IPostBackDataHandler.
Chapluck,

46

WebMethods.

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

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

Ora, nella tua pagina ASPX puoi fare questo:

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

E chiama il tuo metodo lato server tramite JavaScript utilizzando:

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

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

45

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

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

44

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

Mappatura tag

È usato raramente perché c'è solo una situazione specifica in cui ne avresti bisogno, ma quando ne hai bisogno, è così utile.

Alcuni articoli su questa funzione poco conosciuta:

Mappatura dei tag in ASP.NET
Uso della mappatura dei tag in ASP.NET 2.0

e da quell'ultimo articolo:

La mappatura dei tag consente di scambiare controlli compatibili in fase di compilazione su ogni pagina dell'applicazione Web. Un esempio utile è se si dispone di un controllo ASP.NET di riserva, come DropDownList, e si desidera sostituirlo con un controllo personalizzato derivato da DropDownList. Questo potrebbe essere un controllo che è stato personalizzato per fornire una cache più ottimizzata dei dati di ricerca. Invece di modificare ogni modulo Web e sostituire le DropDownLists integrate con la tua versione personalizzata, puoi fare in modo che ASP.NET lo faccia per te modificando web.config:

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

Ciò sarebbe molto confuso per gli altri sviluppatori del tuo team
Aykut Akıncı,

1
@Aykut - In effetti potrebbe essere, motivo per cui dichiaro che la sua utilità è piuttosto stretta, tuttavia, quando richiesto, è molto utile. Inoltre, mi accerterei che qualsiasi utilizzo di Tag Mapping sia stato documentato in modo molto chiaro per evitare confusione e ambiguità.
CraigTP

43

HttpModules . L'architettura è pazzesca ed elegante. Forse non è una funzione nascosta, ma comunque interessante.


3
HttpModules è qualcosa di avanzato, ma non lo definirei raro o meno usato (o mi chiamerei ingenuo). Ma sì, adoro l'architettura.
Vaibhav,

+1 perché molti sviluppatori esperti possono conoscere HttpModules ma non comprendono appieno la loro relazione con le richieste. (Stessa cosa con HttpHandlers)
John Bubriski

34

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

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

5
Ci sono persone che davvero non sanno che ci sono commenti?
Joe Phillips,

7
Mi piace quando trovi mezza pagina aspx in <! - commenti ...
Bryan Rehbein,

È piuttosto semplice funzionalità di ASP.NET
rafek,

34

Il generatore di espressioni di codice

Markup 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 è possibile utilizzare la databinding come espressioni in situazioni non di databinding. Puoi anche creare altri Expression Builder che svolgono altre funzioni.

web.config:

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

La classe cs che rende tutto ciò possibile:

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

1
cosa intendi con "e altri" nel titolo?
Khaled Musaied,

Beh, immagino di non essere mai arrivato agli altri.
Andleer,

2
+1, funzionalità davvero interessante ... In realtà è abbastanza simile alle estensioni di markup di WPF
Thomas Levesque,

non è lo stesso che usare <%= /*code*/ %>?
Bevacqua,

33

Utilizzo del tipo di file ASHX:
se si desidera semplicemente generare alcuni html o xml di base senza passare attraverso i gestori di eventi di pagina, è possibile implementare HttpModule in modo semplice

Denominare la pagina come SomeHandlerPage.ashx e inserire semplicemente il codice seguente (solo una riga) in essa

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

5
Vale la pena notare che è necessario aggiungere IRequiresSessionState o IReadOnlySessionState se necessario, altrimenti non ci sarà.
Tracker1,

3
Vale anche la pena notare che è possibile specificare l'installazione del gestore in web.config in modo da non avere un file ashx fisico in giro. Oppure è possibile registrare il gestore in modo programmatico nell'avvio dell'applicazione nell'asax globale.
Phill,



26

Ho lavorato su un'applicazione asp.net che è stata sottoposta a un audit di sicurezza da una delle principali società di sicurezza e ho imparato questo semplice trucco per prevenire una vulnerabilità di sicurezza meno nota ma importante.

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

Prendi in considerazione l'utilizzo di 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;
}

Impostare la proprietà su un valore che si conosce sia univoco per ciascun utente, ad esempio un ID sessione, un nome utente o un identificatore 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 che è già pieno di dati ViewState. ViewState può essere generato da una pagina che l'attaccante aveva precedentemente creato, ad esempio una pagina del carrello con 100 articoli. L'attaccante attira un utente ignaro a navigare nella pagina, quindi l'attaccante fa in modo che la pagina venga inviata al server in cui ViewState è valido. Il server non ha modo di sapere che ViewState ha avuto origine dall'aggressore. 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'attaccante accede a una pagina per creare ViewState, la proprietà viene inizializzata con il suo nome. Quando l'utente legittimo invia la pagina al server, viene inizializzata con il nome dell'attaccante. Di conseguenza, il controllo HMAC ViewState non riesce e viene generata un'eccezione.


2
Ricorda anche di lasciare base.OnInit (e); affinché la funzione Page_Init () faccia il suo lavoro.
Druido,

Penso che questo trucco possa fallire se un utente reale non ha accettato i cookie o se sessionid ha un timeout.
Aristos,

1
Non è necessario base.OnInit(e);se si utilizza AutoEventWireup="true"per la pagina.
Adam Nofsinger

1
Druid: non sta ignorando OnInit (nel qual caso, base.OnInit (e) sarebbe necessario).
crdx,

L'uso dell'ID sessione per ViewStateUserKey funziona solo dopo l'avvio effettivo di una sessione. Significa anche che queste pagine possono scadere dopo la scadenza della sessione. Nei casi in cui tali problemi rappresentano un problema, potresti prendere in considerazione l'utilizzo di qualcosa di più durevole, come l'indirizzo IP dell'utente.
RickNZ,


20

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 del modulo ora riconosce l'attributo action. Ottimo per quando si utilizza la riscrittura degli URL

20

Proprietà DefaultButton nei pannelli.

Imposta il pulsante predefinito per un determinato pannello.


1
Attenzione, non funziona su tutti i tipi di pulsanti, ad es. LinkButtons!
Kovu,


19

Utilizzo di configSource per dividere i file di configurazione.

È possibile utilizzare l'attributo configSource in un file web.config per inviare elementi di configurazione ad altri file .config, ad esempio invece di:

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

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

    <appSettings configSource="myAppSettings.config" />

Il myAppSettings.configfile:

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

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 desidera solo che siano in grado di modificare solo alcune impostazioni.

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


1
Funziona anche con qualsiasi tipo di progetto .net, ad esempio l'app desktop. configs
Zoltan Veres,


16

HttpContext.IsCustomErrorEnabled è una funzionalità interessante, l'ho trovata utile più di una volta. Ecco un breve post a riguardo.


16

Per impostazione predefinita, qualsiasi contenuto tra i tag per un controllo personalizzato viene aggiunto come controllo figlio. Questo può essere intercettato in una sostituzione AddParsedSubObject () per il filtro o l'analisi aggiuntiva (ad esempio, del contenuto del 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);
     }

...

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

13

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


7
Non faresti meglio usando un gestore .ASHX per generare feed RSS?
Dan Diplo,

Immagino che ciò dipenda dalla complessità del progetto. Non tutti hanno la capacità o le competenze per creare e compilare gestori. Nella pagina asp.net funziona abbastanza bene per questo
Kevin Goff,

1
E puoi usare qualcosa come <asp: Repeater> per generare elementi RSS e fare altri trucchi (come usare LogInView per rimuovere alcuni elementi) che è molto meglio che scrivere stringhe da ASHX IMO
chakrit

LinqToXml + ASHX è la strada da percorrere!
Carlos Muñoz,

Questo è utile per molto più della generazione di feed RSS. IIRC, HTML5 deve avere il tag <! Doctype html> sulla prima riga in alto per convalidare correttamente.
Roy Tinker,

12

Prima che ASP.NET v3.5 aggiungesse le route, è possibile creare i propri URL descrittivi semplicemente scrivendo un HTTPModule e riscrivendo la richiesta all'inizio della pipeline della pagina (come l'evento BeginRequest).

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

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

DotNetNuke ha un ottimo HttpModule che lo fa per i loro URL amichevoli. È ancora utile per i computer in cui non è possibile distribuire .NET v3.5.


Ciò richiede il mapping di tutte le richieste IIS su ASP.NET
John Sheehan,

O solo il gestore degli errori 404.
FlySwat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.