Funciones ocultas de ASP.NET

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 funciones 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 son enseñadas por los libros de texto.

¿Cuáles son los que sabes?

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

       

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

Esta es la forma más rápida y sencilla de mostrar su aviso de “Sitio temporalmente no disponible” al volver a implementar (o deshacer) 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.

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

Esto será capturado por ASP.NET que devolverá la página customErrors. Aprendí acerca de este en un reciente .NET Tip of the Day Post

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

  

Resumen rápido: estamos presentando un nuevo conmutador optimizeComstacktions en ASP.NET que puede mejorar enormemente la velocidad de comstackción en algunos escenarios. Hay algunas capturas, así que sigue leyendo para más detalles. Este interruptor está actualmente disponible como QFE para 3.5SP1, y formará parte de VS 2010.

El sistema de comstackció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 estaba topando 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 comstackción “optimizado” que requiere un enfoque mucho menos conservador para la recomstackción.

Vía aquí :

  • 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, de una clase de ayuda poco acoplada).

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

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

  • Se puede recuperar un objeto de página desde un archivo .ASPX programáticamente llamando a PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)

Modo de venta minorista en el nivel machine.config:

      

Sobrescribe la configuración de web.config para imponer la depuración en falso, activa los errores personalizados e inhabilita el rastreo. No se olvide de cambiar los atributos antes de publicarlos, simplemente déjelos todos configurados para entornos de desarrollo o prueba y actualice la configuración de producción minorista.

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

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

solo agrega una directiva más a la página

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

Si no quieres usar la ruta virtual y usar el nombre de la clase en su lugar, entonces

 <%@ MasterType TypeName="MyMainMasterPage" %> 

Obtenga el artículo completo aquí

HttpContext.Items como herramienta de caché de nivel de solicitud

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 “código subyacente”.

Crear 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" %> 

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

Puedes usar:

  Request.Params[Control.UniqueId] 

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

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

WebMethods.

Puede usar las devoluciones de llamada AJAX de ASP.NET para los métodos web colocados 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 GetFruitBeginingWith(string letter) { List products = new List() { "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:

 

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

   

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

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

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

Etiquetado de tags

Rara vez 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 pequeña característica conocida:

Tag Mapping en ASP.NET
Usar la asignación de tags en ASP.NET 2.0

y de ese último artículo:

La asignación de tags le permite intercambiar controles compatibles en tiempo de comstackción en cada página de su aplicación web. Un ejemplo útil es si tiene un control stock ASP.NET, como DropDownList, y desea reemplazarlo con un control personalizado derivado de DropDownList. Esto 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 el DropDownLists incorporado con su versión personalizada, puede hacer que ASP.NET lo haga modificando web.config:

       

HttpModules . La architecture es locamente elegante. Tal vez no sea una función oculta, pero genial, no obstante.

Puede usar los comentarios de ASP.NET dentro de una página .aspx para comentar las partes completas de una página, incluidos los controles del servidor. Y los contenidos que están comentados nunca serán enviados al cliente.

 <%-- 
--%>

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 constructor de expresiones de código es que puede usar enlaces de datos como expresiones en situaciones que no sean de enlace de datos. También puede crear otros constructores de expresiones que realicen otras funciones.

web.config:

     

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

Uso del tipo de archivo ASHX:
Si solo quieres enviar algunos html o xml básicos sin pasar por los manejadores de eventos de la página, entonces puedes implementar el HttpModule de manera simple.

Nombra la página como SomeHandlerPage.ashx y simplemente pon el código debajo (solo una línea) en él

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

Establecer las propiedades de control del servidor basadas en el navegador de destino y más .

  

Ese me tomó un poco por sorpresa.

System.Web.VirtualPathUtility

Trabajé en una aplicación asp.net que pasó por una auditoría de seguridad de una empresa de seguridad líder y aprendí este truco fácil para evitar una vulnerabilidad de seguridad menos conocida pero importante.

La siguiente explicació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 con un clic. Si autentica a sus interlocutores y utiliza ViewState, establezca 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 exclusivo de cada usuario, como una ID de sesión, un nombre de usuario o un identificador de usuario.

Un ataque con un solo 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 de ViewState. ViewState se puede generar a partir de una página que el atacante creó previamente, como una página de carrito de compras con 100 elementos. El atacante atrae a un usuario desprevenido para que explore la página, y luego el atacante hace que la página se envíe al servidor donde ViewState es válido. El servidor no tiene forma de saber que ViewState se originó del 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 a 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.

HttpContext.Current.IsDebuggingEnabled

Esto es ideal para determinar qué scripts dar como salida (versiones mínima o completa) o cualquier otra cosa que desee en el desarrollo, pero no en vivo.

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 de formulario ahora reconoce el atributo de acción. Ideal para cuando estás usando la reescritura de URL

Propiedad DefaultButton en Paneles.

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

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

      

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

   

El archivo myAppSettings.config :

      

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

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

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

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

De forma predeterminada, cualquier contenido entre tags para un control personalizado se agrega como control secundario. Esto puede ser interceptado en una anulación AddParsedSubObject () para el filtrado o el análisis adicional (por ejemplo, del 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); } 

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

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

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 ruta 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 a continuación (a menudo usando expresiones regulares).

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

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