Fonctionnalités cachées d'ASP.NET [fermé]


292

Cette question existe parce qu'elle a une signification historique, mais elle n'est pas considérée comme une bonne question sur le sujet pour ce site, veuillez donc ne pas l'utiliser comme preuve que vous pouvez poser des questions similaires ici.

Plus d'informations: https://stackoverflow.com/faq


Il existe toujours des fonctionnalités qui seraient utiles dans les scénarios marginaux, mais pour cette raison même, la plupart des gens ne les connaissent pas. Je demande des fonctionnalités qui ne sont généralement pas enseignées par les manuels.

Quels sont ceux que vous connaissez?


Bonne question, je souhaite pouvoir voter plusieurs fois!
Gavin Miller

1
D'accord. J'aime des discussions comme celle-ci. Il y a tellement de profondeur dans le framework, que vous êtes parfois étonné de choses que vous ne saviez pas.
Deane

J'apprends tellement de nouveaux trucs sympas à partir des réponses dans ce fil - merci! :)
Maxim Zaslavsky

16
Plutôt que "Fonctionnalités cachées de ..", ces choses ne devraient pas être appelées "Fonctionnalités peu connues de .." car la plupart des réponses sont bien documentées dans MSDN ou ailleurs, tout simplement peu connues ou utilisées.
John K

Voir meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… , et les publications Meta connexes pour une discussion sur la pertinence et la clôture.

Réponses:


335

Pendant les tests, vous pouvez envoyer des e-mails dans un dossier de votre ordinateur au lieu d'un serveur SMTP. Mettez ceci dans votre web.config:

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

6
Vraiment? J'étais sur le point d'installer un faux serveur SMTP, comme Dumbster. J'ai caché un joyau.
Eduardo Molteni

2
Est-ce que quelqu'un sait si vous pouvez spécifier un partage UNC pour l'emplacement du répertoire?
Mark Sherretta,

32
Mieux encore, mettez cela sur votre boîte de développement machine.config, afin que vous n'ayez pas à changer le web.config sur chaque application que vous créez.
Max Toro

Pouvez-vous le configurer pour qu'il ne le fasse que sur l'hôte local? De cette façon, vous n'avez pas à le changer à chaque fois?
chobo2

Il n'y a pas de réglage pour ça. Vous devrez gérer les différences de configuration à l'aide d'autres méthodes (projets de déploiement Web, tâches de génération, etc.)
John Sheehan

210

Si vous placez un fichier nommé app_offline.htm à la racine d'un répertoire d'application Web, ASP.NET 2.0+ arrêtera l'application et arrêtera le traitement normal de toute nouvelle demande entrante pour cette application, affichant uniquement le contenu de app_offline.htm fichier pour toutes les nouvelles demandes .

Il s'agit du moyen le plus rapide et le plus simple d'afficher votre avis "Site temporairement indisponible" lors du redéploiement (ou de la restauration) des modifications sur un serveur de production.

De plus, comme l'a souligné marxidad , assurez-vous d'avoir au moins 512 octets de contenu dans le fichier pour qu'IE6 le rende correctement.


10
N'oubliez pas la solution de contournement pour les messages "amicaux" d'IE: tinyurl.com/app-offline-friendly
Mark Cidade

1
Aie! Soyez prudent lorsque vous l'utilisez avec MOSS 2007. Cela ne fonctionnera que pour les pages qui ont été consultées depuis le dernier redémarrage d'IIS. Donc, si vous ajoutez cette page à votre racine virtuelle wss, puis essayez d'ouvrir une page qui n'avait pas été consultée précédemment, vous obtiendrez un 404.
Marc

1
@Marc - J'ai reçu cette astuce de Scott Guthrie, si vous vous sentez généreux, vous aideriez beaucoup de développeurs SharePoint à éviter ce scénario si vous commentiez
Troy DeMonbreun

De plus, cela déclenchera également un recyclage du domaine d'application et fermera toutes les connexions de base de données ouvertes, une fois toutes les demandes terminées.
Bart Verkoeijen

Il y a une mise en garde à celui-ci: IIS renvoie le contenu app_offline.htm avec un code d'état HTTP de 404. Si un moteur de recherche se promenait et tentait d'indexer votre site pendant que vous êtes dans ce mode hors ligne, vous pourriez ne pas apprécier les résultats. Mais cela fonctionne très bien pour mon application Web d'entreprise privée!
Larry Silverman

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

Cela sera rattrapé par ASP.NET qui renverra la page customErrors. En savoir plus sur celui-ci dans un récent article .NET Astuce du jour


Certains développeurs pourraient faire valoir qu'il est préférable de conclure les choses manuellement dans HttpContext.Response plutôt que de lever une exception qui est une opération assez coûteuse dans les livres .NET.
lubos hasko

N'est-ce pas une mauvaise forme? Vous affichez l'erreur 404, tandis que vous souhaitez afficher une erreur / exception.
Donnie Thomas

1
Un cas auquel je peux penser est que si quelqu'un joue malicieusement avec les paramètres et met quelque chose de invalide, vous voulez probablement un 404 générique pas une erreur spécifique.
John Sheehan

3
A voté uniquement parce que je connais maintenant le site Astuce du jour .NET.
Kon

cela ne fonctionne que lorsque vous le lancez dans httpModule ou httpHandler
Khaled Musaied

75

Voici le meilleur. Ajoutez ceci à votre web.config pour une compilation BEAUCOUP plus rapide. Il s'agit de la version 3.5SP1 via ce QFE .

<compilation optimizeCompilations="true">

Résumé rapide: nous introduisons un nouveau commutateur OptimizeCompilations dans ASP.NET qui peut considérablement améliorer la vitesse de compilation dans certains scénarios. Il y a des captures, alors lisez la suite pour plus de détails. Ce commutateur est actuellement disponible en tant que QFE pour 3.5SP1 et fera partie de VS 2010.

Le système de compilation ASP.NET adopte une approche très conservatrice qui lui fait effacer tout travail précédent qu'il a effectué chaque fois qu'un fichier de «niveau supérieur» change. Les fichiers de «haut niveau» incluent tout dans bin et App_Code, ainsi que global.asax. Bien que cela fonctionne bien pour les petites applications, il devient presque inutilisable pour les très grandes applications. Par exemple, un client se heurtait à un cas où il fallait 10 minutes pour actualiser une page après avoir apporté une modification à un assemblage «bin».

Pour soulager la douleur, nous avons ajouté un mode de compilation «optimisé» qui adopte une approche beaucoup moins conservatrice de la recompilation.

Via ici :


6
Est-ce "activé par défaut" avec VS 2010 ou dois-je quand même l'essayer?
M4N

73
  • HttpContext.Current vous donnera toujours accès à la requête / réponse / etc. Du contexte actuel, même lorsque vous n'avez pas accès aux propriétés de la page (par exemple, à partir d'une classe d'assistance à couplage lâche).

  • Vous pouvez continuer à exécuter du code sur la même page après avoir redirigé l'utilisateur vers une autre en appelant Response.Redirect ( url , false )

  • Vous n'avez pas besoin de fichiers .ASPX si tout ce que vous voulez est une page compilée (ou tout IHttpHandler ). Définissez simplement le chemin et les méthodes HTTP pour pointer vers la classe dans l' <httpHandlers>élément du fichier web.config.

  • Un objet Page peut être récupéré à partir d'un fichier .ASPX par programmation en appelant PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)


À propos de Response.Redirect (url, false) - C'est tellement ce que j'espérais depuis longtemps .. Je ne sais pas comment j'ai raté ça mais thanxxx
Subliminal Hash

1
Quelqu'un peut-il expliquer ce que vous en feriez? Je sais que cela a une certaine valeur, mais je ne comprends pas pourquoi ...
Deane

5
Si vous souhaitez rediriger l'utilisateur vers une autre adresse mais que vous avez encore du traitement en arrière-plan à faire (par exemple, une demande de génération de rapport qui redirige vers la page d'état de génération du rapport pendant qu'elle continue de générer le rapport en arrière-plan)
Mark Cidade

Quelqu'un peut-il expliquer une situation utile pour PageParser.GetCompiledPageInstance (..)? Les documents disent que c'est pour l'utilisation de l'infrastructure - il retourne un type IHttpHandler donc je ne vois pas comment il peut être utilisé pratiquement.
John K

@jdk: Je l'ai utilisé dans le passé lors de la substitution du gestionnaire par défaut pour les requêtes * .aspx afin que je puisse utiliser des objets IHttpHandler dynamiques en mémoire mais aussi utiliser GetCompiledPageInstance () pour les fichiers physiques * .aspx.
Mark Cidade

70

Mode Retail au niveau machine.config:

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

Substitue les paramètres web.config pour appliquer le débogage à false, active les erreurs personnalisées et désactive le suivi. N'oubliez plus de modifier les attributs avant la publication. Laissez-les tous configurés pour les environnements de développement ou de test et mettez à jour les paramètres de vente au détail.


1
J'oublie parfois de changer le débogage de la compilation en faux avant la publication, ce qui affecte négativement les performances. Plus de problème!
Roy Tinker

59

Activer Intellisense pour MasterPages dans les pages de contenu
Je suis sûr que c'est un hack très peu connu

La plupart du temps, vous devez utiliser la méthode findcontrol et convertir les contrôles en page maître à partir des pages de contenu lorsque vous souhaitez les utiliser, le MasterType directive intellisense dans Visual Studio une fois que vous y serez

il suffit d'ajouter une autre directive à la page

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

Si vous ne souhaitez pas utiliser le chemin virtuel et utiliser le nom de classe à la place,

<%@ MasterType TypeName="MyMainMasterPage" %>

Obtenez l'article complet ici


L'utilisation du FindControl peut parfois être mouvementée, merci pour ce bon conseil!
Alexandre Brisebois

4
Son utilisation peut entraîner un comportement inattendu. Voir stackoverflow.com/questions/1998931/…
citronas

Personnellement, je pense que la fonctionnalité devrait être ignorée par les gens, elle couple la page à la page principale. Si vous finissez par utiliser les propriétés / méthodes de la page maître, puis changez la page maître, vous vous retrouvez avec un cauchemar de maintenance.
Phill

@Phil: Parfois, cela est nécessaire et avoir un accès typé à une page maître est bien meilleur que l'approche FindControl. Au moins, vous obtenez le message du compilateur et pouvez le corriger rapidement.
Durden81

58

HttpContext.Items en tant qu'outil de mise en cache au niveau de la demande


2
Cela allait être mon point également, je l'utilise dans les contrôles imbriqués pour transmettre / recevoir des informations sur le niveau de la demande. Je l'utilise également dans MVC pour stocker une liste de fichiers js à ajouter, basés sur des vues partielles.
Tracker1

1
Je l'utilise lorsque j'utilise le routage asp.net pour transmettre les paramètres récupérés des URL à mes pages. (pas avec MVC) idéal pour la réécriture d'URL et est assez flexible.
Alexandre Brisebois

Hmmmm, j'ai juste pensé à un endroit où j'aurais pu utiliser ça au lieu de Session - ta!
Mike Kingscott,

52

Deux choses ressortent dans ma tête:

1) Vous pouvez activer et désactiver Trace à partir du code:

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

2) Vous pouvez créer plusieurs pages .aspx en utilisant un seul fichier partagé "code-behind".

Créez un fichier .cs d'une 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";
        }
    }

et puis vous pouvez avoir un nombre illimité de pages .aspx (après avoir supprimé le code -designer .designer.cs et .cs que VS a généré):

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

Vous pouvez avoir des contrôles dans l'ASPX qui n'apparaissent pas dans Class1, et vice-versa, mais vous devez vous rappeler de vérifier vos contrôles pour des valeurs nulles.


J'aurais voté cela, mais je n'ai plus de votes. Je vais essayer de me souvenir de revenir voter pour cela. Je ne savais pas que nous pourrions avoir le même fichier Code Behind pour plusieurs pages. Je ne sais pas comment cela fonctionnerait.
Vaibhav

5
Est-ce que quelqu'un d'autre pense que c'est un risque pour la sécurité de vous permettre d'activer une trace à partir d'une URL? (# 1) Je ne vais pas dévaloriser cette question, mais il est important de comprendre le risque là-bas.
Kevin Goff

5
Absolument, vous devriez vraiment mettre ce code dans un bloc #ifdef DEBUG #endif
Radu094

Grands commentaires, soulignant l'aspect sécurité.
Vaibhav

2
Pourquoi est-ce un risque pour la sécurité d'activer une trace à partir de l'URL? Comment peut-il être utilisé pour me nuire?
Kamarey

48

Vous pouvez utiliser:

 Request.Params[Control.UniqueId] 

Pour obtenir la valeur d'un contrôle AVANT que viewstate ne soit initialisé (Control.Text, etc. sera vide à ce stade).

Ceci est utile pour le code dans Init.


L'initialisation de Viewstate ne traite pas avec Request.Params. Utilisez-le AVANT d'augmenter la méthode LoadPostData du contrôle implémenté IPostBackDataHandler.
chapluck

46

WebMethods.

Vous pouvez utiliser les rappels ASP.NET AJAX aux méthodes Web placées dans les pages ASPX. Vous pouvez décorer une méthode statique avec les attributs [WebMethod ()] et [ScriptMethod ()]. Par exemple:

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

Maintenant, dans votre page ASPX, vous pouvez le faire:

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

Et appelez votre méthode côté serveur via JavaScript en utilisant:

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

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

45

Vérifiez si le client est toujours connecté avant de démarrer une tâche de longue durée:

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

44

Une fonctionnalité peu connue et rarement utilisée d'ASP.NET est:

Cartographie des balises

Il est rarement utilisé car il n'y a qu'une situation spécifique où vous en auriez besoin, mais quand vous en avez besoin, c'est tellement pratique.

Quelques articles sur cette fonctionnalité peu connue:

Mappage de balises dans ASP.NET
Utilisation du mappage de balises dans ASP.NET 2.0

et de ce dernier article:

Le mappage de balises vous permet d'échanger des contrôles compatibles au moment de la compilation sur chaque page de votre application Web. Un exemple utile est si vous avez un contrôle ASP.NET stock, tel qu'un DropDownList, et que vous souhaitez le remplacer par un contrôle personnalisé dérivé de DropDownList. Il peut s'agir d'un contrôle personnalisé pour fournir une mise en cache plus optimisée des données de recherche. Au lieu de modifier chaque formulaire Web et de remplacer les DropDownLists intégrés par votre version personnalisée, vous pouvez avoir ASP.NET en effet le faire pour vous en modifiant web.config:

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

Ce serait très déroutant pour les autres développeurs de votre équipe
Aykut Akıncı

1
@Aykut - En effet, cela pourrait l'être, c'est pourquoi je déclare que son utilité est plutôt étroite, cependant, lorsque cela est nécessaire, c'est très pratique. De plus, je m'assurerais que toute utilisation de Tag Mapping était très clairement documentée pour éviter toute confusion et ambiguïté.
CraigTP

43

HttpModules . L'architecture est folle et élégante. Peut-être pas une fonctionnalité cachée, mais cool quand même.


3
HttpModules est quelque chose de avancé, mais je ne dirais pas qu'il est rare ou moins utilisé (ou me dit naïf). Mais oui, j'aime l'architecture.
Vaibhav

+1, car de nombreux développeurs chevronnés connaissent peut-être HttpModules mais ne comprennent pas pleinement leur relation avec les demandes. (Même chose avec HttpHandlers)
John Bubriski

34

Vous pouvez utiliser les commentaires ASP.NET dans une page .aspx pour mettre en commentaire des parties complètes d'une page, y compris les contrôles serveur. Et le contenu commenté ne sera jamais envoyé au client.

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

5
Il y a des gens qui ne savent vraiment pas qu'il y a des commentaires?
Joe Phillips

7
J'aime quand vous trouvez une demi-page aspx dans <! - commentaires ...
Bryan Rehbein

C'est une fonctionnalité plutôt nue d'ASP.NET
rafek

34

Le générateur d'expression de code

Exemple de balisage:

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

La vraie beauté du générateur d'expressions de code est que vous pouvez utiliser des expressions de liaison de données comme dans des situations sans liaison de données. Vous pouvez également créer d'autres générateurs d'expressions qui exécutent d'autres fonctions.

web.config:

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

La classe cs qui fait que tout se passe:

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

1
que voulez-vous dire par «et autres» dans le titre?
Khaled Musaied

Eh bien, je suppose que je ne suis jamais arrivé aux autres.
andleer

2
+1, fonctionnalité vraiment cool ... C'est en fait assez similaire aux extensions de balisage de WPF
Thomas Levesque

n'est-ce pas la même chose que d'utiliser <%= /*code*/ %>?
bevacqua

33

Utilisation du type de fichier ASHX:
Si vous souhaitez simplement sortir du HTML ou du XML de base sans passer par les gestionnaires d'événements de page, vous pouvez implémenter le HttpModule de manière simple

Nommez la page en tant que SomeHandlerPage.ashx et insérez simplement le code ci-dessous (une seule ligne)

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

Ensuite, le fichier de code

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
Il convient de noter que vous devez ajouter IRequiresSessionState ou IReadOnlySessionState si vous en avez besoin, sinon il ne sera pas là.
Tracker1

3
Il convient également de noter que vous pouvez spécifier la configuration du gestionnaire dans le web.config afin que vous n'ayez pas besoin d'avoir un fichier ashx physique autour. Ou vous pouvez enregistrer le gestionnaire par programme dans le démarrage de votre application dans l'asax global.
Phill



26

J'ai travaillé sur une application asp.net qui a subi un audit de sécurité par une société de sécurité de premier plan et j'ai appris cette astuce simple pour éviter une vulnérabilité de sécurité moins connue mais importante.

L'explication ci-dessous provient de: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Pensez à utiliser Page.ViewStateUserKey pour contrer les attaques en un clic. Si vous authentifiez vos appelants et utilisez ViewState, définissez la propriété Page.ViewStateUserKey dans le gestionnaire d'événements▶Init pour empêcher les attaques en un clic.

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

Définissez la propriété sur une valeur que vous savez unique à chaque utilisateur, telle qu'un ID de session, un nom d'utilisateur ou un identifiant d'utilisateur.

Une attaque en un clic se produit lorsqu'un attaquant crée une page Web (.htm ou .aspx) qui contient un champ de formulaire masqué nommé __VIEWSTATE qui est déjà rempli de données ViewState. Le ViewState peut être généré à partir d'une page que l'attaquant avait précédemment créée, comme une page de panier contenant 100 articles. L'attaquant attire un utilisateur sans méfiance dans la navigation vers la page, puis l'attaquant provoque l'envoi de la page au serveur sur lequel ViewState est valide. Le serveur n'a aucun moyen de savoir que le ViewState provient de l'attaquant. La validation ViewState et les HMAC ne contrent pas cette attaque car le ViewState est valide et la page est exécutée dans le contexte de sécurité de l'utilisateur.

En définissant la propriété ViewStateUserKey, lorsque l'attaquant accède à une page pour créer ViewState, la propriété est initialisée à son nom. Lorsque l'utilisateur légitime soumet la page au serveur, elle est initialisée avec le nom de l'attaquant. Par conséquent, la vérification ViewState HMAC échoue et une exception est générée.


2
N'oubliez pas de quitter la base.OnInit (e); pour que la fonction▶Init () fasse son travail.
Druide

Je pense que cette astuce peut échouer si un utilisateur réel n'a pas accepté les cookies, ou si sessionid a un délai d'expiration.
Aristos

1
Vous n'avez pas besoin base.OnInit(e);si vous utilisez AutoEventWireup="true"la page.
Adam Nofsinger

1
Druide: Il ne remplace pas OnInit (dans ce cas, base.OnInit (e) serait nécessaire).
crdx

L'utilisation de l'ID de session pour ViewStateUserKey ne fonctionne qu'après le démarrage d'une session. Cela signifie également que ces pages peuvent expirer après l'expiration de la session. Dans les cas où ces problèmes sont une préoccupation, vous pourriez envisager d'utiliser quelque chose de plus durable, comme l'adresse IP de l'utilisateur.
RickNZ

25

HttpContext.Current.IsDebuggingEnabled

C'est idéal pour déterminer quels scripts afficher (versions min ou complètes) ou tout autre élément que vous pourriez souhaiter en dev, mais pas en direct.


Je suis d'accord avec Jan, mais il peut parfois être intéressant d'avoir une application qui soit au courant de son état d'exécution Debug / Release.
Alexandre Brisebois

20

Inclus dans ASP.NET 3.5 SP1:

  • customErrors prend désormais en charge l'attribut "redirectMode" avec une valeur de "ResponseRewrite". Affiche la page d'erreur sans changer d'URL.
  • La balise de formulaire reconnaît désormais l'attribut d'action. Idéal lorsque vous utilisez la réécriture d'URL

20

Propriété DefaultButton dans les panneaux.

Il définit le bouton par défaut pour un panneau particulier.


1
Attention, ne fonctionne pas sur toutes sortes de boutons, par exemple LinkButtons!
Kovu


19

Utilisation de configSource pour diviser les fichiers de configuration.

Vous pouvez utiliser l'attribut configSource dans un fichier web.config pour pousser des éléments de configuration vers d'autres fichiers .config, par exemple, au lieu de:

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

... vous pouvez avoir la totalité de la section appSettings stockée dans un autre fichier de configuration. Voici la nouveauté web.config:

    <appSettings configSource="myAppSettings.config" />

Le myAppSettings.configdossier:

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

Ceci est très utile pour les scénarios où vous déployez une application sur un client et que vous ne voulez pas qu'ils interfèrent avec le fichier web.config lui-même et que vous souhaitez simplement qu'ils puissent modifier quelques paramètres.

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


1
Cela fonctionne également sur tout type de projet .net, ex app Desktop. configs
Zoltan Veres


16

HttpContext.IsCustomErrorEnabled est une fonctionnalité intéressante que j'ai trouvée utile plusieurs fois. Voici un court article à ce sujet.


16

Par défaut, tout contenu entre les balises d'un contrôle personnalisé est ajouté en tant que contrôle enfant. Cela peut être intercepté dans un remplacement AddParsedSubObject () pour le filtrage ou l'analyse supplémentaire (par exemple, du contenu de texte dans 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

Si ASP.NET génère un flux RSS, il mettra parfois une ligne supplémentaire en haut de la page. Cela ne sera pas validé avec les validateurs RSS courants. Vous pouvez contourner ce problème en plaçant la directive page <@Page>au bas de la page.


7
Ne feriez-vous pas mieux d'utiliser un gestionnaire .ASHX pour générer des flux RSS?
Dan Diplo

Je suppose que cela dépend de la complexité du projet. Tout le monde n'a pas la capacité ou les compétences pour créer et compiler des gestionnaires. Dans la page asp.net fonctionne assez bien pour cela
Kevin Goff

1
Et vous pouvez utiliser quelque chose comme <asp: Repeater> pour générer des éléments RSS et faire d'autres astuces (comme utiliser LogInView pour supprimer certains éléments), ce qui est bien mieux que d'écrire des chaînes depuis ASHX IMO
chakrit

LinqToXml + ASHX est la voie à suivre!
Carlos Muñoz

Ceci est utile pour bien plus que la génération de flux RSS. IIRC, HTML5 doit avoir la balise <! Doctype html> sur la première ligne en haut pour valider correctement.
Roy Tinker

12

Avant qu'ASP.NET v3.5 ajoute des itinéraires, vous pouviez créer vos propres URL conviviales simplement en écrivant un HTTPModule et en réécrivant la demande au début du pipeline de pages (comme l'événement BeginRequest).

Des URL comme http: // nom_serveur / page / Param1 / SomeParams1 / Param2 / SomeParams2 seraient mappées vers une autre page comme ci-dessous (en utilisant souvent des expressions régulières).

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

DotNetNuke a un très bon HttpModule qui fait cela pour leurs URL amicales. Est toujours utile pour les machines sur lesquelles vous ne pouvez pas déployer .NET v3.5.


Cela nécessite de mapper toutes les demandes IIS vers ASP.NET
John Sheehan

Ou tout simplement le gestionnaire d'erreurs 404.
FlySwat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.