Características ocultas de ASP.NET [cerrado]

292

Esta pregunta existe porque tiene un significado histórico, pero no se considera una buena pregunta sobre el tema para este sitio, así que no la use como evidencia de que puede hacer preguntas similares aquí.

Más información: https://stackoverflow.com/faq


Siempre hay características que serían útiles en escenarios marginales, pero por esa misma razón la mayoría de la gente no las conoce. Estoy pidiendo características que normalmente no se enseñan en los libros de texto.

¿Cuáles son los que sabes?

Vaibhav
fuente
Buena pregunta, ¡ojalá pudiera votar varias veces!
Gavin Miller
1
Convenido. Me encanta hilos como este. Hay tanta profundidad en el marco que a veces te sorprenden cosas que nunca supiste que estaban allí.
Deane
Estoy aprendiendo muchos trucos nuevos y geniales de las respuestas en este hilo, ¡gracias! :)
Maxim Zaslavsky
16
En lugar de "Características ocultas de ...", ¿no deberían estas cosas llamarse "Características poco conocidas de ..." porque la mayoría de las respuestas están bien documentadas en MSDN o en otros lugares, simplemente no se conocen o usan comúnmente.
John K
Consulte meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… y las publicaciones relacionadas de Meta para debatir sobre la idoneidad y el cierre.

Respuestas:

335

Durante la prueba, puede enviar correos electrónicos a una carpeta de su computadora en lugar de a un servidor SMTP. Pon esto en tu web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
John Sheehan
fuente
66
De Verdad? Estaba a punto de instalar un servidor SMTP falso, como Dumbster. Yo escondí gema.
Eduardo Molteni
2
¿Alguien sabe si puede especificar un recurso compartido UNC para la ubicación del directorio?
Mark Sherretta
32
Mejor aún, ponga esto en su caja de desarrollo machine.config, para que no tenga que cambiar el web.config en cada aplicación que cree.
Max Toro
¿Puedes configurarlo para que solo haga esto en el host local? De esa manera no tienes que cambiarlo todo el tiempo?
chobo2
No hay escenario para eso. Tendrá que gestionar las diferencias de configuración utilizando otros métodos (proyectos de implementación web, tareas de compilación, etc.)
John Sheehan
210

Si coloca un archivo llamado app_offline.htm en la raíz de un directorio de aplicaciones web, ASP.NET 2.0+ cerrará la aplicación y detendrá el procesamiento normal de cualquier nueva solicitud entrante para esa aplicación, mostrando solo el contenido de app_offline.htm archivo para todas las nuevas solicitudes .

Esta es la forma más rápida y fácil de mostrar su aviso de "Sitio temporalmente no disponible" al volver a implementar (o revertir) los cambios en un servidor de producción.

Además, como lo señala marxidad , asegúrese de tener al menos 512 bytes de contenido dentro del archivo para que IE6 lo represente correctamente.

Troy DeMonbreun
fuente
10
No olvide la solución para los mensajes "amigables" de IE: tinyurl.com/app-offline-friendly
Mark Cidade
1
¡Ay! Tenga cuidado al usar esto con MOSS 2007. Solo funcionará para páginas a las que se haya accedido desde el último reinicio de IIS. Entonces, si agrega esta página a su raíz virtual wss, intente abrir una página a la que no se haya accedido anteriormente, obtendrá un 404.
Marc
1
@Marc - Recibí este consejo de Scott Guthrie, si te sientes generoso, estarías ayudando a muchos desarrolladores de SharePoint a evitar este escenario si comentaras el artículo del Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun
Además, esto también activará un reciclaje del dominio de la aplicación y cerrará cualquier conexión de base de datos abierta, una vez que todas las solicitudes hayan finalizado.
Bart Verkoeijen
Hay una advertencia sobre esto: IIS devuelve el contenido app_offline.htm con un código de estado HTTP de 404. Si un motor de búsqueda deambula e intenta indexar su sitio mientras está en este modo fuera de línea, es posible que no aprecie los resultados. ¡Pero funciona muy bien para mi aplicación web corporativa privada!
Larry Silverman
119
throw new HttpException(404, "Article not found");

ASP.NET lo detectará y devolverá la página customErrors. Aprendí sobre este en un reciente .NET Consejo del día Post

John Sheehan
fuente
Algunos desarrolladores podrían argumentar que es mejor concluir las cosas manualmente en HttpContext.Response en lugar de lanzar una excepción que es una operación bastante costosa en los libros .NET.
lubos hasko
¿No es esta mala forma? Está mostrando el error 404, mientras que desea mostrar un error / excepción.
Donnie Thomas el
1
Un caso en el que puedo pensar es que si alguien está jugando mal con los parámetros y pone algo inválido, probablemente desee un 404 genérico, no un error específico.
John Sheehan el
3
Voté únicamente porque ahora conozco el sitio .NET Tip of the Day.
Kon
funciona solo cuando lo lanzas en httpModule o httpHandler
Khaled Musaied
75

Aquí está el mejor. Agregue esto a su web.config para una compilación MUCHO más rápida. Esta es la publicación 3.5SP1 a través de este QFE .

<compilation optimizeCompilations="true">

Resumen rápido: estamos presentando un nuevo conmutador de OptimizeCompilations en ASP.NET que puede mejorar en gran medida la velocidad de compilación en algunos escenarios. Hay algunas capturas, así que sigue leyendo para obtener más detalles. Actualmente, este conmutador está disponible como QFE para 3.5SP1 y formará parte de VS 2010.

El sistema de compilación ASP.NET adopta un enfoque muy conservador que hace que elimine cualquier trabajo previo que haya realizado cada vez que cambia un archivo de "nivel superior". Los archivos de "nivel superior" incluyen cualquier cosa en bin y App_Code, así como global.asax. Si bien esto funciona bien para aplicaciones pequeñas, se vuelve casi inutilizable para aplicaciones muy grandes. Por ejemplo, un cliente se encontraba con un caso en el que tardaba 10 minutos en actualizar una página después de realizar cualquier cambio en un ensamblaje 'bin'.

Para aliviar el dolor, agregamos un modo de compilación 'optimizado' que adopta un enfoque mucho menos conservador para la recompilación.

Vía aquí :

Scott Hanselman
fuente
66
¿Está "activado por defecto" con VS 2010 o aún debería probarlo?
M4N
73
  • HttpContext.Current siempre le dará acceso a la Solicitud / Respuesta / etc. del contexto actual, incluso cuando no tenga acceso a las propiedades de la Página (por ejemplo, desde una clase auxiliar acoplada libremente).

  • Puede continuar ejecutando código en la misma página después de redirigir al usuario a otro llamando a Response.Redirect ( url , false )

  • No necesita archivos .ASPX si todo lo que quiere es una página compilada (o cualquier IHttpHandler ). Simplemente configure la ruta y los métodos HTTP para apuntar a la clase en el <httpHandlers>elemento en el archivo web.config.

  • Un objeto de página se puede recuperar de un archivo .ASPX mediante programación llamando a PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)

Mark Cidade
fuente
Acerca de Response.Redirect (url, false) - Eso es mucho de lo que esperaba durante mucho tiempo ... No sé cómo me perdí eso, pero graciasxxx
Subliminal Hash el
1
¿Alguien puede explicar qué harías con esto? Sé que tiene algún valor, pero no puedo entender por qué ...
Deane
55
Si desea redirigir al usuario a una dirección diferente pero aún tiene que realizar un procesamiento de fondo (por ejemplo, una solicitud de generación de informes que redirige a la página de estado de generación del informe mientras continúa generando el informe en segundo plano)
Mark Cidade
¿Alguien puede explicar una situación útil para PageParser.GetCompiledPageInstance (..)? Los documentos dicen que es para uso de infraestructura: devuelve un tipo IHttpHandler, por lo que no veo cómo se puede usar prácticamente.
John K
@jdk: Lo he usado en el pasado al anular el controlador predeterminado para las solicitudes * .aspx para poder usar objetos IHttpHandler dinámicos en memoria pero también usar GetCompiledPageInstance () para archivos físicos * .aspx.
Mark Cidade
70

Modo comercial en el nivel machine.config:

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

Anula la configuración de web.config para aplicar la depuración a falso, activa los errores personalizados y deshabilita el seguimiento. Ya no se olvide de cambiar los atributos antes de publicar, simplemente déjelos configurados para entornos de desarrollo o prueba y actualice la configuración de venta minorista de producción.

Troy Hunt
fuente
1
A veces olvido cambiar la depuración de compilación a falsa antes de publicar, lo que afecta negativamente el rendimiento. ¡Ya no hay problema!
Roy Tinker
59

Habilitación de intellisense para MasterPages en las páginas de contenido
Estoy seguro de que este es un truco muy poco conocido

La mayoría de las veces tiene que usar el método findcontrol y emitir los controles en la página maestra desde las páginas de contenido cuando desea usarlos, el MasterType directiva habilitará intellisense en Visual Studio una vez que lo haga.

simplemente agregue una directiva más a la página

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

Si no desea utilizar la Ruta virtual y utilizar el nombre de la clase, entonces

<%@ MasterType TypeName="MyMainMasterPage" %>

Obtenga el artículo completo aquí

Binoj Antony
fuente
Usar el FindControl a veces puede ser agitado, ¡gracias por este gran consejo!
Alexandre Brisebois
44
Usar esto puede provocar un comportamiento inesperado. Ver stackoverflow.com/questions/1998931/…
citronas
Personalmente, creo que la característica debe dejarse desconocida para las personas, ya que combina la página con la página maestra. Si termina utilizando las propiedades / métodos de la página maestra y luego cambia la página maestra, termina con una pesadilla de mantenimiento.
Phill
@ Phil: a veces es necesario y tener un acceso estáticamente escrito a una página maestra es mucho mejor que el enfoque FindControl. Al menos obtienes el mensaje del compilador y puedes solucionarlo rápidamente.
Durden81
58

HttpContext.Items como una herramienta de almacenamiento en caché a nivel de solicitud

John Sheehan
fuente
2
Este sería mi punto también, lo uso en controles anidados para pasar / recibir información de nivel de solicitud. También uso esto en MVC para almacenar una lista de archivos js para agregar, basada en vistas parciales.
Rastreador1
1
Lo uso cuando uso el enrutamiento asp.net para pasar los parámetros obtenidos de las URL a mis páginas. (no con MVC) ideal para la reescritura de URL y es bastante flexible.
Alexandre Brisebois
Hmmmm, solo pensé en algún lugar donde podría haber usado esto en lugar de Session - ta!
Mike Kingscott
52

Dos cosas se destacan en mi cabeza:

1) Puede activar y desactivar Trace desde el código:

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

2) Puede construir múltiples páginas .aspx usando solo un archivo compartido de "código subyacente".

Cree un archivo .cs de clase:

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

y luego puede tener cualquier cantidad de páginas .aspx (después de eliminar .designer.cs y .cs code-behind que VS ha generado):

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

Puede tener controles en el ASPX que no aparezcan en la Clase 1 y viceversa, pero debe recordar para verificar que los controles no tengan valores nulos.

Radu094
fuente
Hubiera votado esto, pero me quedé sin votos. Voy a tratar de recordar volver a votar esto. No sabía que podríamos tener el mismo archivo de código subyacente para varias páginas. No estoy seguro, cómo funcionaría eso.
Vaibhav
55
¿Alguien más piensa que es un riesgo de seguridad permitirle activar un rastreo desde una URL? (# 1) No voy a rechazar esta pregunta, pero es importante entender el riesgo allí.
Kevin Goff
55
Absolutamente, realmente deberías poner ese código en un bloque #ifdef DEBUG #endif
Radu094
Grandes comentarios, señalando el aspecto de seguridad.
Vaibhav
2
¿Por qué es un riesgo de seguridad activar un rastreo desde la URL? ¿Cómo se puede usar para hacerme daño?
Kamarey
48

Puedes usar:

 Request.Params[Control.UniqueId] 

Para obtener el valor de un control ANTES de que se inicialice viewstate (Control.Text, etc. estará vacío en este punto).

Esto es útil para el código en Init.

FlySwat
fuente
La inicialización de Viewstate no se trata con Request.Params. Úselo ANTES de generar el método LoadPostData de control implementado IPostBackDataHandler.
chapluck
46

WebMethods.

Puede usar las devoluciones de llamada ASP.NET AJAX a métodos web ubicados en páginas ASPX. Puede decorar un método estático con los atributos [WebMethod ()] y [ScriptMethod ()]. Por ejemplo:

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

Ahora, en su página ASPX puede hacer esto:

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

Y llame a su método del lado del servidor a través de JavaScript usando:

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

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

Verifique si el cliente todavía está conectado, antes de comenzar una tarea de larga duración:

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

Una característica poco conocida y poco utilizada de ASP.NET es:

Mapeo de etiquetas

Raramente se usa porque solo hay una situación específica donde la necesitarías, pero cuando la necesitas, es muy útil.

Algunos artículos sobre esta característica poco conocida:

Asignación de etiquetas en ASP.NET
mediante la asignación de etiquetas en ASP.NET 2.0

y de ese último artículo:

El mapeo de etiquetas le permite intercambiar controles compatibles en tiempo de compilación en cada página de su aplicación web. Un ejemplo útil es si tiene un control ASP.NET estándar, como DropDownList, y desea reemplazarlo con un control personalizado derivado de DropDownList. Este podría ser un control que se ha personalizado para proporcionar un almacenamiento en caché más optimizado de los datos de búsqueda. En lugar de editar cada formulario web y reemplazar las DropDownLists integradas con su versión personalizada, puede hacer que ASP.NET lo haga por usted modificando web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>
CraigTP
fuente
Esto sería muy confuso para otros desarrolladores en su equipo
Aykut Akıncı
1
@Aykut: De hecho, podría serlo, por eso afirmo que su utilidad es bastante limitada, sin embargo, cuando es necesario, es muy útil. Además, me aseguraría de que cualquier uso de la asignación de etiquetas se documentara muy claramente para evitar confusiones y ambigüedades.
CraigTP
43

HttpModules . La arquitectura es locamente elegante. Tal vez no sea una característica oculta, pero no obstante genial.

Allain Lalonde
fuente
3
HttpModules es algo avanzado, pero no lo llamaría raro o menos usado (o me llamaría ingenuo). Pero sí, me encanta la arquitectura.
Vaibhav
+1 porque muchos desarrolladores experimentados pueden conocer HttpModules pero no entienden completamente su relación con las solicitudes. (Lo mismo con HttpHandlers)
John Bubriski
34

Puede usar los comentarios de ASP.NET dentro de una página .aspx para comentar partes completas de una página, incluidos los controles del servidor. Y los contenidos que se comentan nunca se enviarán al cliente.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Chris Pietschmann
fuente
55
¿Hay personas que realmente no saben que hay comentarios?
Joe Phillips
77
Me gusta cuando encuentras media página aspx en <! - comentarios ...
Bryan Rehbein
Es más bien característica desnuda de ASP.NET
rafek
34

El generador de expresiones de código

Marcado de muestra:

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

La verdadera belleza del generador de expresiones de código es que puede usar el enlace de datos como expresiones en situaciones sin enlace de datos. También puede crear otros constructores de expresiones que realicen otras funciones.

web.config:

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

La clase cs que hace que todo suceda:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 
andleer
fuente
1
¿Qué quieres decir con "y otros" en el título?
Khaled Musaied
Bueno, supongo que nunca llegué a los demás.
andleer
2
+1, característica realmente genial ... Eso es en realidad bastante similar a las extensiones de marcado de WPF
Thomas Levesque
¿No es esto lo mismo que usar <%= /*code*/ %>?
bevacqua
33

Uso del tipo de archivo ASHX:
si solo desea generar algunos html o xml básicos sin pasar por los controladores de eventos de la página, puede implementar el HttpModule de una manera simple

Asigne un nombre a la página como SomeHandlerPage.ashx y simplemente coloque el siguiente código (solo una línea)

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

Luego el archivo de código

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; }
        }
    }
}
revs Binoj Antony
fuente
55
Vale la pena señalar que debe agregar IRequiresSessionState o IReadOnlySessionState si lo necesita, de lo contrario no estará allí.
Rastreador1
3
También vale la pena señalar que puede especificar la configuración del controlador en web.config para que no necesite tener un archivo ashx físico. O puede registrar el controlador mediante programación en el inicio de su aplicación en el asax global.
Phill
26

Trabajé en una aplicación asp.net que fue sometida a una auditoría de seguridad por parte de una empresa de seguridad líder y aprendí este sencillo truco para evitar una vulnerabilidad de seguridad menos conocida pero importante.

La explicación a continuación es de: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Considere usar Page.ViewStateUserKey para contrarrestar los ataques de un clic. Si autentica a las personas que llaman y usa ViewState, configure la propiedad Page.ViewStateUserKey en el controlador de eventos Page_Init para evitar ataques con un solo clic.

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

Establezca la propiedad en un valor que sepa que es único para cada usuario, como un ID de sesión, nombre de usuario o identificador de usuario.

Un ataque de un clic ocurre cuando un atacante crea una página web (.htm o .aspx) que contiene un campo de formulario oculto llamado __VIEWSTATE que ya está lleno de datos ViewState. ViewState se puede generar a partir de una página que el atacante había creado previamente, como una página de carrito de compras con 100 artículos. El atacante atrae a un usuario desprevenido a navegar a la página, y luego el atacante hace que la página se envíe al servidor donde el ViewState es válido. El servidor no tiene forma de saber que ViewState se originó en el atacante. La validación de ViewState y los HMAC no contrarrestan este ataque porque ViewState es válido y la página se ejecuta bajo el contexto de seguridad del usuario.

Al establecer la propiedad ViewStateUserKey, cuando el atacante navega por una página para crear ViewState, la propiedad se inicializa con su nombre. Cuando el usuario legítimo envía la página al servidor, se inicializa con el nombre del atacante. Como resultado, la verificación ViewState HMAC falla y se genera una excepción.

Craig McKeachie
fuente
2
También recuerde dejar base.OnInit (e); para que la función Page_Init () haga su trabajo.
Druida
Creo que este truco puede fallar si un usuario real no acepta las cookies, o si sessionid tiene tiempo de espera.
Aristos
1
No es necesario base.OnInit(e);si está utilizando AutoEventWireup="true"para la página.
Adam Nofsinger
1
Druida: No está anulando OnInit (en cuyo caso, base.OnInit (e) sería necesario).
crdx
El uso de la ID de sesión para ViewStateUserKey solo funciona después de que una sesión realmente ha comenzado. También significa que estas páginas pueden agotar el tiempo de espera una vez que finaliza la sesión. En los casos en que esos problemas sean preocupantes, puede considerar usar algo más duradero, como la dirección IP del usuario.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Esto es excelente para determinar qué scripts generar (versiones mínimas o completas) o cualquier otra cosa que desee en dev, pero no en vivo.

John Sheehan
fuente
Estoy de acuerdo con Jan, pero a veces puede ser interesante tener una aplicación que conozca su estado de ejecución Debug / Release.
Alexandre Brisebois el
20

Incluido en ASP.NET 3.5 SP1:

  • customErrors ahora admite el atributo "redirectMode" con un valor de "ResponseRewrite". Muestra la página de error sin cambiar la URL.
  • La etiqueta del formulario ahora reconoce el atributo de acción. Genial para cuando estás usando reescritura de URL
John Sheehan
fuente
20

Propiedad DefaultButton en paneles.

Establece el botón predeterminado para un panel en particular.

MRG
fuente
1
¡Atención, no funciona en todo tipo de botones, por ejemplo, LinkButtons!
Kovu
19

Usando configSource para dividir archivos de configuración.

Puede usar el atributo configSource en un archivo web.config para enviar elementos de configuración a otros archivos .config, por ejemplo, en lugar de:

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

... puede tener toda la sección AppSettings almacenada en otro archivo de configuración. Aquí está lo nuevo web.config:

    <appSettings configSource="myAppSettings.config" />

El myAppSettings.configarchivo:

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

Esto es bastante útil para escenarios en los que despliega una aplicación a un cliente y no desea que interfieran con el archivo web.config en sí y solo quiere que puedan cambiar solo algunas configuraciones.

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

Ryan Shripat
fuente
1
Esto también está funcionando en cualquier tipo de proyecto .net, ex aplicación de escritorio. configs
Zoltan Veres
17

MaintainScrollPositionOnPostback atributo en la directiva de página. Se utiliza para mantener la posición de desplazamiento de la página aspx en las devoluciones.

MRG
fuente
1
Un comentario sería útil para mejorar la respuesta.
MRG
16

HttpContext.IsCustomErrorEnabled es una característica genial. Lo he encontrado útil más de una vez. Aquí hay una breve publicación al respecto.

Kilhoffer
fuente
16

De forma predeterminada, cualquier contenido entre etiquetas para un control personalizado se agrega como control secundario. Esto se puede interceptar en una anulación AddParsedSubObject () para filtrar o analizar adicionalmente (por ejemplo, el contenido de texto en 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>
Mark Cidade
fuente
13

Si tiene ASP.NET generando una fuente RSS, a veces colocará una línea adicional en la parte superior de la página. Esto no se validará con validadores RSS comunes. Puede solucionarlo colocando la directiva de la página <@Page>en la parte inferior de la página.

Kevin Goff
fuente
77
¿No sería mejor usar un controlador .ASHX para generar fuentes RSS?
Dan Diplo
Supongo que eso depende de la complejidad del proyecto. No todos tienen la capacidad o las habilidades para crear y compilar controladores. En la página asp.net funciona razonablemente bien para esto
Kevin Goff el
1
Y puede usar algo como <asp: Repeater> para generar elementos RSS y hacer otros trucos (como usar LogInView para eliminar algunos elementos) que es mucho mejor que escribir cadenas desde ASHX IMO
chakrit
¡LinqToXml + ASHX es el camino a seguir!
Carlos Muñoz
Esto es útil para mucho más que la generación de fuentes RSS. IIRC, HTML5 debe tener la etiqueta <! Doctype html> en la primera línea en la parte superior para validar correctamente.
Roy Tinker
12

Antes de que ASP.NET v3.5 agregara rutas, podía crear sus propias URL amigables simplemente escribiendo un HTTPModule y reescribiendo la solicitud al principio de la canalización de la página (como el evento BeginRequest).

Las URL como http: // servername / page / Param1 / SomeParams1 / Param2 / SomeParams2 se asignarían a otra página como se muestra a continuación (a menudo utilizando expresiones regulares).

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

DotNetNuke tiene un HttpModule realmente bueno que hace esto por sus URL amigables. Todavía es útil para máquinas donde no puede implementar .NET v3.5.

Tyler
fuente
Esto requiere asignar todas las solicitudes de IIS a ASP.NET
John Sheehan el
O simplemente el controlador de errores 404.
FlySwat