Novedades de ASP.NET 4.5 y Visual Studio 2012
Este documento describe las nuevas características y mejoras que se presentan en ASP.NET 4.5. También describe las mejoras en marcha para el desarrollo web en Visual Studio 2012. Este documento se publicó por primera vez el 29 de febrero de 2012.
Tiempo de ejecución y marco de ASP.NET Core
Lectura y escritura asincrónica de las solicitudes y respuestas HTTP
Compatibilidad con módulos y controladores asincrónicos de espera y basados en tareas
Nuevas características de validación de solicitudes de ASP.NET
Mejoras de rendimiento para el hospedaje web
- Factores de rendimiento clave
- Requisitos para las nuevas características de rendimiento
- Uso compartido de ensamblados comunes
- Uso de la compilación JIT de varios núcleos para un inicio más rápido
- Ajuste de la recolección de elementos no utilizados para optimizar la memoria
- Captura previa de aplicaciones web
Versión candidata para lanzamiento de Visual Studio 2012
Cambios de configuración en plantillas de sitio web de ASP.NET 4.5
Compatibilidad nativa en IIS 7 para el enrutamiento de ASP.NET
-
- Tareas inteligentes
- Soporte técnico de WAI-ARIA
- Nuevos fragmentos de código HTML5
- Extracción a control de usuario
- IntelliSense para fragmentos de código en atributos
- Cambio de nombre automático de la etiqueta coincidente al cambiar el nombre de una etiqueta de apertura o de cierre
- Generación del controlador de eventos
- Sangría inteligente
- Reducción automática para la finalización de instrucciones
Tiempo de ejecución y marco de ASP.NET Core
Lectura y escritura asincrónica de las solicitudes y respuestas HTTP
ASP.NET 4 introdujo la capacidad de leer una entidad de solicitud HTTP como una secuencia con el método HttpRequest.GetBufferlessInputStream. Este método proporcionó acceso de secuencias a la entidad de solicitud. Sin embargo, se ejecutó de forma sincrónica, lo que bloqueaba un subproceso durante la duración de una solicitud.
ASP.NET 4.5 admite la capacidad de leer secuencias de forma asincrónica en una entidad de solicitud HTTP y la capacidad de vaciado asincrónico. ASP.NET 4.5 también le ofrece la capacidad de duplicar el búfer de una entidad de solicitud HTTP, lo que facilita la integración con controladores HTTP descendentes, como controladores de página .aspx y de ASP.NET MVC.
Mejoras en el control de HttpRequest
La referencia de secuencia que ASP.NET 4.5 devuelve desde HttpRequest.GetBufferlessInputStream admite métodos de lectura sincrónicos y asincrónicos. El objeto de secuencia que GetBufferlessInputStream devuelve ya implementa los métodos BeginRead y EndRead. Los métodos de secuencia asincrónicos le permiten leer de forma asincrónica la entidad de solicitud por fragmentos, mientras que ASP.NET libera el subproceso en curso entre cada iteración de un bucle de lectura asincrónico.
ASP.NET 4.5 también ha añadido un método complementario para leer la entidad de solicitud de forma almacenada en búfer: HttpRequest.GetBufferedInputStream. Este nuevo método funciona como GetBufferlessInputStream, que admite lecturas sincrónicas y asincrónicas. Sin embargo, a medida que lee, GetBufferedInputStream también copia los bytes de entidad en búferes internos de ASP.NET para que los módulos y controladores de nivel inferior puedan acceder a la entidad de solicitud. Por ejemplo, si algún código ascendente de la canalización ya ha leído la entidad de solicitud con GetBufferedInputStream, todavía puede usar HttpRequest.Form o HttpRequest.Files. Esto le permite realizar el procesamiento asincrónico en una solicitud (por ejemplo, transmitir una carga de archivos grande a una base de datos), sin dejar de ejecutar páginas .aspx y controladores de ASP.NET MVC después.
Vaciado asincrónico de una respuesta
El envío de respuestas a un cliente HTTP puede tardar mucho tiempo si el cliente está lejos o tiene una conexión de ancho de banda bajo. Normalmente, ASP.NET almacena en búfer los bytes de respuesta según una aplicación los crea. Luego, ASP.NET realiza una sola operación de envío de los búferes acumulados al final del procesamiento de solicitudes.
Si la respuesta almacenada en búfer es grande (por ejemplo, enviar un archivo grande a un cliente), debe llamar periódicamente a HttpResponse.Flush para enviarle la salida almacenada en búfer al cliente y mantener el uso de memoria bajo control. Sin embargo, dado que Flush es una llamada sincrónica, la llamada iterativa a Flush todavía usa un subproceso durante la duración de las solicitudes potencialmente de larga duración.
ASP.NET 4.5 añade compatibilidad para realizar vaciados de forma asincrónica con los métodos BeginFlush y EndFlush de la clase HttpResponse. Con estos métodos, puede crear módulos y controladores asincrónicos que envíen datos de forma incremental a un cliente sin usar subprocesos del sistema operativo. Durante las llamadas BeginFlush y EndFlush, ASP.NET libera el subproceso en curso. Esto reduce considerablemente el número total de subprocesos activos necesarios para soportar descargas HTTP de larga duración.
Compatibilidad con módulos y controladores asincrónicos de espera y basados en tareas
.NET Framework 4 introdujo un concepto de programación asincrónico con el nombre de tarea. Las tareas se representan mediante el tipo Task y los tipos relacionados en el espacio de nombres System.Threading.Tasks. .NET Framework 4.5 se basa en esto con mejoras del compilador que facilitan el trabajo con objetos Task. En .NET Framework 4.5, los compiladores admiten dos palabras clave nuevas: await y async. La palabra clave await es abreviatura sintáctica para indicar que un fragmento de código debe esperar de forma asincrónica en algún otro fragmento de código. La palabra clave async representa una sugerencia que puede usar para marcar métodos como asincrónicos basados en tareas.
La combinación de await, asyncy el objetoTask facilita mucho la escritura de código asincrónico en .NET 4.5. ASP.NET 4.5 admite estas simplificaciones con nuevas API que le permite escribir módulos HTTP y controladores HTTP asincrónicos con las nuevas mejoras del compilador.
Módulos HTTP asincrónicos
Supongamos que desea realizar un trabajo asincrónico dentro de un método que devuelve un objeto Task. El siguiente código de ejemplo define un método asincrónico que hace una llamada asincrónica para descargar la página principal de Microsoft. Fíjese en el uso de la palabra clave async en la firma del método y la llamada de await a DownloadStringTaskAsync.
private async Task
ScrapeHtmlPage(object caller, EventArgs e)
{
WebClient wc = new WebClient();
var result = await wc.DownloadStringTaskAsync("http://www.microsoft.com");
// Do something with the result
}
Tan solo tiene que escribir esto: .NET Framework controlará automáticamente el desenredado de la pila de llamadas mientras espera a que la descarga se complete, también restaura automáticamente la pila de llamadas cuando la descarga termine.
Ahora supongamos que desea usar este método asincrónico en un módulo HTTP de ASP.NET asincrónico. ASP.NET 4.5 incluye un método auxiliar (EventHandlerTaskAsyncHelper) y un nuevo tipo de delegado (TaskEventHandler) que puede usar para integrar métodos asincrónicos basados en tareas con el modelo de programación asincrónico anteriormente expuesto por la canalización HTTP de ASP.NET. En este ejemplo cómo:
public void Init(HttpApplication
context)
{
// Wrap the Task-based method so that it can be used with
// the older async programming model.
EventHandlerTaskAsyncHelper helper =
new EventHandlerTaskAsyncHelper(ScrapeHtmlPage);
// The helper object makes it easy to extract Begin/End methods out of
// a method that returns a Task object. The ASP.NET pipeline calls the
// Begin and End methods to start and complete calls on asynchronous
// HTTP modules.
context.AddOnPostAuthorizeRequestAsync(
helper.BeginEventHandler, helper.EndEventHandler);
}
Controladores HTTP asincrónicos
El enfoque tradicional para escribir controladores asincrónicos en ASP.NET es implementar la interfaz IHttpAsyncHandler. ASP.NET 4.5 presenta el tipo de base asincrónico HttpTaskAsyncHandler del que puede derivar, lo que facilita mucho la escritura de controladores asincrónicos.
El tipo HttpTaskAsyncHandler es abstracto y requiere que invalide el método ProcessRequestAsync. Internamente, ASP.NET se encarga de integrar la firma de retorno (un objeto Task) de ProcessRequestAsync con el modelo de programación asincrónico anterior que usa la canalización de ASP.NET.
El siguiente ejemplo muestra cómo puede usar Task y await como parte de la implementación de un controlador HTTP asincrónico:
public class MyAsyncHandler : HttpTaskAsyncHandler
{
// ...
// ASP.NET automatically takes care of integrating the Task based override
// with the ASP.NET pipeline.
public override async Task ProcessRequestAsync(HttpContext context)
{
WebClient wc = new WebClient();
var result = await
wc.DownloadStringTaskAsync("http://www.microsoft.com");
// Do something with the result
}
}
Nuevas características de validación de solicitudes de ASP.NET
De forma predeterminada, ASP.NET realiza la validación de solicitudes: examina las solicitudes para buscar marcado o script en campos, encabezados, cookies y demás. Si se detecta algo, ASP.NET produce una excepción. Esto actúa como primera línea de defensa contra posibles ataques de scripting entre sitios.
ASP.NET 4.5 facilita la lectura selectiva de los datos de solicitud no validados. También integra la conocida biblioteca AntiXSS, que anteriormente era una biblioteca externa.
Los desarrolladores solicitaban con frecuencia la capacidad de desactivar selectivamente la validación de solicitudes de las aplicaciones. Por ejemplo, si la aplicación es un software de foro, es posible que quiera permitir que los usuarios envíen publicaciones y comentarios en foros con formato HTML, pero asegúrese de que la validación de solicitudes compruebe todo lo demás.
ASP.NET 4.5 presenta dos características que facilitan el trabajo selectivo con entradas no validadas: la validación diferida de solicitudes y acceso a datos de solicitud no validados.
Validación de solicitudes diferidas
En ASP.NET 4.5, de forma predeterminada, todos los datos de solicitud están sujetos a validación de solicitudes. Sin embargo, puede configurar la aplicación para que aplace la validación de solicitudes hasta que en efecto acceda a los datos de solicitud. (Esto se conoce a veces como validación diferida de solicitudes, se basa en términos como la carga diferida en determinados escenarios de datos.) Puede configurar la aplicación para que use la validación diferida en el archivo Web.config al establecer el atributo requestValidationMode en 4.5 en el elemento httpRUntime, como en el siguiente ejemplo:
<httpRuntime requestValidationMode="4.5" ... />
Cuando el modo de validación de solicitudes se establece en 4.5, la validación de solicitudes solo se desencadena para un valor de solicitud específico y solo cuando el código accede a ese valor. Por ejemplo, si el código obtiene el valor de Request.Form["forum_post"], la validación de solicitudes se invoca solo para ese elemento de la colección de formularios. No se valida ninguno de los demás elementos de la colección del Formulario. En versiones anteriores de ASP.NET, la validación de solicitudes se desencadenaba para toda la recolección de solicitudes cuando se accedía a cualquier elemento de la colección. El nuevo comportamiento facilita que los distintos componentes de la aplicación examinen distintos fragmentos de datos de solicitud sin desencadenar la validación de solicitudes en otras partes.
Compatibilidad con solicitudes no validadas
La validación de solicitudes diferidas no soluciona el problema de omitir de forma selectiva la validación de solicitudes por sí sola. La llamada a Request.Form["forum_post"] desencadena la validación de solicitudes de ese valor de solicitud específico. Sin embargo, es posible que desee acceder a este campo sin desencadenar la validación porque desea permitir marcado en ese campo.
Para permitir esto, ASP.NET ya 4.5 admite el acceso no validado para solicitar datos. ASP.NET 4.5 incluye una nueva propiedad de colección No validada en la clase HttpRequest. Esta colección proporciona acceso a todos los valores comunes de los datos de solicitud, como Form, QueryString, Cookies, y Url.
Con el ejemplo del foro, para poder leer datos de solicitud no validados, primero debe configurar la aplicación para que use el nuevo modo de validación de solicitudes:
<httpRuntime requestValidationMode="4.5" ...
/>
Puede usar por tanto la propiedad HttpRequest.Unvalidated para leer el valor del formulario no validado:
var s = context.Request.Unvalidated.Form["forum_post"];
Advertencia
Seguridad: !tenga cuidado al usar los datos de solicitud no validados! ASP.NET 4.5 agregó las propiedades y colecciones de solicitudes no validadas para facilitarle acceder a datos de solicitud no validados muy específicos. Sin embargo, todavía debe hacer una validación personalizada de los datos de solicitud sin procesar para asegurarse de que el texto peligroso no se representa a los usuarios.
Biblioteca AntiXSS
Debido a la popularidad de la biblioteca Microsoft AntiXSS, ASP.NET 4.5 ya incorpora rutinas de codificación básicas de la versión 4.0 de esa biblioteca.
Las rutinas de codificación se implementan con el tipo AntiXssEncoder en el nuevo espacio de nombres System.Web.Security.AntiXss. Puede usar el tipo AntiXssEncoder directamente con una llamada a cualquiera de los métodos de codificación estáticos que se implementan en el tipo. Sin embargo, el enfoque más sencillo para usar las nuevas rutinas anti-XSS es configurar que una aplicación de ASP.NET use la clase AntiXssEncoder de forma predeterminada. Para ello, agregue el siguiente atributo al archivo Web.config:
<httpRuntime ...
encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
Cuando el atributo encoderType se establece para usar el tipo AntiXssEncoder, toda la codificación de salida en ASP.NET usa las nuevas rutinas de codificación automáticamente.
Estas son las partes de la biblioteca externa de AntiXSS incorporadas a ASP.NET 4.5:
- HtmlEncode, HtmlFormUrlEncode, y HtmlAttributeEncode
- XmlAttributeEncode y XmlEncode
- UrlEncode y UrlPathEncode (novedad)
- CssEncode
Compatibilidad con el protocolo WebSockets
El protocolo WebSockets es un protocolo de red basado en estándares que define cómo establecer comunicaciones bidireccionales seguras y en tiempo real entre un cliente y servidor a través de HTTP. Microsoft ha trabajado tanto con los organismos de estándares IETF y como con W3C para ayudar a definir el protocolo. El protocolo WebSockets es compatible con cualquier cliente (no solo con exploradores), ya que Microsoft dedica importantes recursos que admiten el protocolo WebSockets tanto en sistemas operativos cliente como en móviles.
El protocolo WebSockets facilita mucho la creación de transferencias de datos de larga duración entre cliente y servidor. Por ejemplo, escribir una aplicación de chat es mucho más fácil porque puede establecer una conexión de larga duración genuina entre cliente y servidor. No es necesario recurrir a soluciones alternativas como el sondeo periódico o sondeo largo HTTP para simular el comportamiento de un socket.
ASP.NET 4.5 e IIS 8 incluyen compatibilidad con WebSockets de bajo nivel, lo que le permite a los desarrolladores de ASP.NET usar API administradas para leer y escribir datos binarios y de cadena en un objeto WebSockets de forma asincrónica. En ASP.NET 4.5, hay un nuevo espacio de nombres System.Web.WebSockets con tipos para trabajar con el protocolo WebSockets.
Un cliente del explorador establece una conexión WebSockets mediante la creación de un objeto DOM WebSocket que apunta a una dirección URL en una aplicación de ASP.NET, como en el siguiente ejemplo:
socket = new WebSocket("ws://contoso.com/MyWebSocketApplication.ashx");
Puede crear puntos de conexión de WebSockets en ASP.NET con cualquier tipo de módulo o controlador. En el ejemplo anterior, se usó un archivo .ashx, ya que son una manera rápida de crear un controlador.
Según el protocolo WebSockets, una aplicación ASP.NET acepta la solicitud WebSockets de un cliente al indicar que la solicitud debe actualizarse desde una solicitud HTTP GET a una solicitud WebSockets. Este es un ejemplo:
HttpContext.Current.AcceptWebSocketRequest(// WebSocket delegate goes here)
El método AcceptWebSocketRequest acepta un delegado de función porque ASP.NET desenreda la solicitud HTTP en curso y, a continuación, transfiere el control al delegado de función. Conceptualmente, este enfoque es similar al uso de System.Threading.Thread, donde se define un delegado de inicio de subproceso en el que se hace el trabajo en segundo plano.
Después de que ASP.NET y el cliente hayan completado un protocolo de enlace de WebSockets correctamente, ASP.NET llama al delegado y la aplicación WebSockets comienza a ejecutarse. El siguiente código de ejemplo muestra una aplicación de eco sencilla que usa la compatibilidad integrada de WebSockets en ASP.NET:
public async Task MyWebSocket(AspNetWebSocketContext context)
{
WebSocket socket = context.WebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
// Asynchronously wait for a message to arrive from a client
WebSocketReceiveResult result =
await socket.ReceiveAsync(buffer, CancellationToken.None);
// If the socket is still open, echo the message back to the client
if (socket.State == WebSocketState.Open)
{
string userMessage = Encoding.UTF8.GetString(buffer.Array, 0,
result.Count);
userMessage = "You sent: " + userMessage + " at " +
DateTime.Now.ToLongTimeString();
buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(userMessage));
// Asynchronously send a message to the client
await socket.SendAsync(buffer, WebSocketMessageType.Text,
true, CancellationToken.None);
}
else { break; }
}
}
La compatibilidad de .NET 4.5 con la palabra clave await y las operaciones asincrónicas basadas en tareas es una buena opción para escribir aplicaciones webSockets. El código de ejemplo muestra que una solicitud de WebSockets se ejecuta completamente de forma asincrónica en ASP.NET. La aplicación espera de forma asincrónica a que se envíe desde un cliente a través de una llamada a await socket.ReceiveAsync. De la misma manera, puede enviar un mensaje asincrónico a un cliente mediante una llamada al socket await. SendAsync.
En el explorador, una aplicación recibe mensajes de WebSockets a través de una función onmessage. Para enviar un mensaje desde un explorador, llame al método send del tipo DOM WebSocket, tal y como se muestra en este ejemplo:
// Receive a string message from the server.
socket.onmessage = function(msg)
{
document.getElementById("serverData").innerHTML = msg.data;
};
// Send a string message from the browser.
socket.send(document.getElementById("msgText"));
En el futuro, quizás publiquemos actualizaciones de esta funcionalidad que abstraen parte de la codificación de bajo nivel necesaria en esta versión para las aplicaciones WebSockets.
Unión y minificación
La agrupación le permite combinar archivos JavaScript y CSS individuales en una agrupación que se puede tratar como un único archivo. La minificación condensa los archivos JavaScript y CSS, para ello quita espacios en blanco y otros caracteres no necesarios. Estas características funcionan con formularios web, ASP.NET MVC y sitios web.
Las agrupaciones se crean con la clase Bundle o una de sus clases secundarias, ScriptBundle y StyleBundle. Tras configurar una instancia de una agrupación, estará disponible para las solicitudes entrantes con tan solo agregarla a una instancia global de BundleCollection. En las plantillas predeterminadas, la configuración de agrupación se hace en un archivo BundleConfig. Esta configuración predeterminada crea agrupaciones de todos los scripts esenciales y archivos css las plantillas usan.
Las vistas referencian a las agrupaciones con el uso de uno de los dos posibles métodos auxiliares. Las clases ScriptBundle y StyleBundle tienen el método auxiliar Render para admitir la representación de un marcado distinto de una agrupación en fase de depuración frente al modo de versión. Cuando están en modo de depuración, Render generará marcado de cada recurso de la agrupación. Cuando esté en modo de versión, Render generará un único elemento de marcado de toda la agrupación. La alternancia entre el modo de depuración y versión se puede hacer al modificar el atributo de depuración del elemento de compilación en web.config, tal y como se muestra a continuación:
<system.web>
<compilation targetframework="4.5" debug="true" />
...</system.web>
Además, habilitar o deshabilitar la optimización se puede establecer directamente a través de la propiedad BundleTable.EnableOptimizations.
BundleTable.EnableOptimizations = true;
Cuando los archivos se agrupan, primero se ordenan alfabéticamente (de la manera en que se muestran en el Explorador de soluciones). Luego, se organizan para que las bibliotecas conocidas y sus extensiones personalizadas (como jQuery, MooTools y Dojo) se carguen primero. Por ejemplo, el orden final de la agrupación de la carpeta Scripts que se muestra anteriormente será:
- jquery-1.6.2.js
- jquery-ui.js
- jquery.tools.js
- a.js
Los archivos CSS también se ordenan alfabéticamente y luego se reorganizan para que reset.css y normalize.css estén antes de cualquier otro archivo. El orden final de la agrupación de la carpeta Styles que se muestra anteriormente será el siguiente:
- reset.css
- content.css
- forms.css
- globals.css
- menu.css
- styles.css
Mejoras de rendimiento para el hospedaje web
.NET Framework 4.5 y Windows 8 presentan características que pueden ayudarle a lograr un aumento significativo del rendimiento de las cargas de trabajo del servidor web. Esto incluye una reducción (hasta un 35 %) tanto del tiempo de inicio como de la superficie de memoria de los sitios de hospedaje web que usan ASP.NET.
Factores de rendimiento clave
Idealmente, todos los sitios web deben estar activos y en memoria para garantizar una respuesta rápida a la próxima solicitud, cuando ocurra. Los factores que pueden afectar a la capacidad de respuesta del sitio incluyen:
- El tiempo que tarda un sitio en reiniciarse después de que un grupo de aplicaciones se recicle. Este es el tiempo necesario para iniciar un proceso de servidor web del sitio cuando los ensamblados de sitio ya no están en memoria. (Los ensamblados de la plataforma todavía están en memoria, ya que otros sitios los usan.) Esta situación se conoce como "inicio del sitio en frío, marco intermedio" o simplemente "inicio de sitio en frío".
- Cantidad de memoria que ocupa el sitio. Los términos para esto son "consumo de memoria por sitio" o "conjunto de trabajo no compartido".
Las nuevas mejoras de rendimiento se centran en ambos factores.
Requisitos para las nuevas características de rendimiento
Los requisitos para las nuevas características se pueden dividir en estas categorías:
- Mejoras que se ejecutan en .NET Framework 4.
- Mejoras que requieren .NET Framework 4.5 pero se pueden ejecutar en cualquier versión de Windows.
- Mejoras disponibles solo con .NET Framework 4.5 que se ejecutan en Windows 8.
El rendimiento aumenta con cada nivel de mejora que puede habilitar.
Algunas de las mejoras de .NET Framework 4.5 también aprovechan las características de rendimiento más amplias que se aplican a otros escenarios.
Uso compartido de ensamblados comunes
Requisito: .NET Framework 4 y SDK de la versión preliminar de Visual Studio 11 Developer
Los distintos sitios de un servidor suelen usar los mismos ensamblados auxiliares (por ejemplo, ensamblados de un kit de inicio o aplicación de ejemplo). Cada sitio tiene una propia copia de estos ensamblados en el directorio Bin. Aunque el código de objeto de los ensamblados es el mismo, son ensamblados físicamente independientes, por lo que cada ensamblado debe leerse por separado durante el inicio del sitio en frío y mantenerse por separado en la memoria.
La nueva funcionalidad de internamiento resuelve esta ineficacia y reduce tanto los requisitos de la RAM como el tiempo de carga. El internamiento le permite a Windows mantener una sola copia de cada ensamblado en el sistema de archivos, y los ensamblados individuales de las carpetas bin del sitio se reemplazan por vínculos simbólicos a la copia única. Si un sitio individual necesita una versión distinta del ensamblado, el vínculo simbólico se reemplaza por la nueva versión del ensamblado y solo afecta a ese sitio.
Compartir ensamblados mediante vínculos simbólicos requiere una nueva herramienta denominada aspnet_intern.exe, que le permite crear y administrar el almacén de ensamblados internados. Se proporciona como parte del SDK de la versión preliminar de Visual Studio 11 Developer. (Sin embargo, funcionará en un sistema que solo tenga instalado .NET Framework 4, dado por hecho que haya instalado la última actualización.)
Ejecute aspnet_intern.exe periódicamente (una vez por semana como una tarea programada, por ejemplo) para asegurarse de que todos los ensamblados aptos se han internado. Un uso típico sería el siguiente:
aspnet_intern -mode exec -sourcedir
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files" -interndir C:\ASPNETCommonAssemblies
Ejecute la herramienta sin argumentos para ver todas las opciones.
Uso de la compilación JIT de varios núcleos para un inicio más rápido
Requisito: .NET Framework 4.5
En el caso de un inicio del sitio en frío, no solo hace falta leer los ensamblados desde el disco, sino que el sitio debe compilarse en JIT. En el caso de un sitio complejo, esto puede agregar retrasos significativos. Una nueva técnica de uso general en .NET Framework 4.5 reduce estos retrasos al distribuir la compilación JIT entre núcleos de procesadores disponibles. Lo hace en la mayor medida y antelación como sea posible mediante el uso de información recopilada durante los lanzamientos anteriores del sitio. El método System.Runtime.ProfileOptimization.StartProfile implementa esta funcionalidad.
La compilación JIT con varios núcleos está habilitada de forma predeterminada en ASP.NET, por lo que no es necesario hacer nada para aprovechar esta característica. Si desea deshabilitar esta característica, realice la siguiente configuración en el archivo Web.config:
<configuration>
<!-- ... -->
<system.web>
<compilation profileGuidedOptimizations="None" />
<!-- ... -->
Ajuste de la recolección de elementos no utilizados para optimizar la memoria
Requisito: .NET Framework 4.5
Una vez que se ejecuta un sitio, su uso del montón recolector de elementos no utilizados (GC, por sus siglas en inglés) puede ser un factor significativo en el consumo de memoria. Al igual que cualquier recolector de elementos no utilizados, el GC de .NET Framework compensa entre el tiempo de CPU (frecuencia e importancia de las recopilaciones) y el consumo de memoria (espacio adicional que se usa para objetos nuevos, liberados o libres). En versiones anteriores, hemos proporcionado instrucciones sobre cómo configurar el GC para obtener el equilibrio adecuado (por ejemplo, consulte Configuración de hospedaje compartido en ASP.NET 2.0/3.5).
En .NET Framework 4.5, en vez de varias configuraciones independientes, hay disponible una configuración definida por la carga de trabajo que habilita todas las opciones de GC recomendadas anteriormente, así como un nuevo ajuste que ofrece un rendimiento adicional para el conjunto de trabajo por sitio.
Para habilitar el ajuste de memoria de GC, agregue la siguiente configuración al archivo Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config:
<configuration>
<!-- ... -->
<runtime>
<performanceScenario value="HighDensityWebHosting" />
<!-- ... -->
(Si conoce las instrucciones anteriores de los cambios en aspnet.config, tenga en cuenta que esta configuración reemplaza la configuración anterior, por ejemplo, no hace falta establecer gcServer, gcConcurrent y demás. No es necesario quitar la configuración anterior.)
Captura previa de aplicaciones web
Requisito: .NET Framework 4.5 que se ejecuta en Windows 8
En varias versiones, Windows ha incluido una tecnología conocida como captura previa que reduce el costo de lectura en disco del inicio de la aplicación. Dado que el inicio en frío es un problema mayoritariamente de las aplicaciones cliente, esta tecnología no se ha incluido en Windows Server, que solo incluye componentes esenciales para un servidor. La captura previa ya está disponible en la versión más reciente de Windows Server, donde puede optimizar el inicio de sitios web individuales.
La captura previa no está habilitada de forma predeterminada en Windows Server. Para habilitar y configurar la captura previa en el hospedaje web de alta densidad, ejecute el siguiente conjunto de comandos en la línea de comandos:
sc config sysmain start=auto
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" /v EnablePrefetcher /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Prefetcher" /v MaxPrefetchFiles /t REG_DWORD /d 8192 /f
net start sysmain
A continuación, para integrar la captura previa con aplicaciones ASP.NET, agregue lo siguiente al archivo Web.config:
<configuration>
<!-- ... -->
<system.web>
<compilation enablePrefetchOptimization="true" />
<!-- ... -->
ASP.NET Web Forms
Controles de datos fuertemente tipados
En ASP.NET 4.5, Web Forms incluye algunas mejoras para trabajar con datos. La primera mejora es controles de datos fuertemente tipados. En el caso de los controles de Web Forms en versiones anteriores de ASP.NET, se muestra un valor enlazado a datos con Eval y una expresión de enlace de datos:
<ul>
<asp:Repeater runat="server" ID="customers">
<ItemTemplate>
<li>
First Name: <%# Eval("FirstName")%><br />
Last Name: <%# Eval("LastName")%><br />
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
Para el enlace de datos bidireccional, use Bind:
<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
<div>
<asp:Label runat="server" AssociatedControlID="firstName">
First Name:</asp:Label>
<asp:TextBox ID="firstName" runat="server"
Text='<%#Bind("FirstName") %>' />
</div>
<div>
<asp:Label runat="server" AssociatedControlID="lastName">
First Name:</asp:Label>
<asp:TextBox ID="lastName" runat="server"
Text='<%#
Bind("LastName") %>' />
</div>
<asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>
En el tiempo de ejecución, estas llamadas usan reflexión para leer el valor del miembro especificado y mostrar el resultado en el marcado. Este enfoque facilita el enlace de datos con datos arbitrarios y sin formato.
Sin embargo, las expresiones de enlace de datos como esta no admiten características como IntelliSense para nombres de miembro, navegación (por ejemplo, Ir a definición) o comprobación del tiempo de compilación de estos nombres.
Para solucionar este problema, ASP.NET 4.5 agrega la capacidad de declarar el tipo de datos de los datos a los que está enlazado un control. Para ello, use la nueva propiedad ItemType. Al establecer esta propiedad, hay dos nuevas variables con tipo disponibles en el ámbito de las expresiones de enlace de datos: Item y BindItem. Dado que las variables están fuertemente tipadas, obtendrá todas las ventajas de la experiencia de desarrollo de Visual Studio.
Para las expresiones de enlace de datos bidireccionales, use la variable BindItem:
<asp:FormView runat="server" ID="editCustomer">
<EditItemTemplate>
<div>
<asp:Label runat="server" AssociatedControlID="firstName">
First Name:</asp:Label>
<asp:TextBox ID="firstName" runat="server"
Text='<%#BindItem.FirstName %>' />
</div>
<div>
<asp:Label runat="server" AssociatedControlID="lastName">
First Name:</asp:Label>
<asp:TextBox ID="lastName" runat="server"
Text='<%#BindItem.LastName %>' />
</div>
<asp:Button runat="server" CommandName="Update"/>
</EditItemTemplate>
</asp:FormView>
La mayoría de los controles del marco de ASP.NET Web Forms que admiten el enlace de datos se han actualizado para admitir la propiedad ItemType.
Enlace de modelos
El enlace de modelos amplía el enlace de datos en los controles de ASP.NET Web Forms para trabajar con acceso a datos enfocados en código. Incorpora conceptos del control ObjectDataSource y del enlace de modelos en ASP.NET MVC.
Selección de datos
Para configurar que un control de datos use el enlace de modelos para seleccionar datos, establezca la propiedad SelectMethod del control en el nombre de un método en el código de la página. El control de datos llama al método en el momento adecuado del ciclo de vida de la página y automáticamente enlaza los datos devueltos. No es necesario llamar explícitamente al método DataBind.
En el siguiente ejemplo, el control GridView está configurado para usar un método con el nombre GetCategories:
<asp:GridView ID="categoriesGrid"
runat="server"
ItemType="WebApplication1.Model.Category"
SelectMethod="GetCategories" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="ID" />
<asp:BoundField DataField="CategoryName" HeaderText="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="# of Products">
<ItemTemplate><%# Item.Products.Count %></ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
El método GetCategories se crea en el código de la página. Para una operación de selección simple, el método no necesita parámetros y debe devolver un objeto IEnumerable o IQueryable. Si se establece la nueva propiedad ItemType (que permite expresiones de enlace de datos fuertemente tipadas, como se explica anteriormente en Controles de datos fuertemente tipados), se deben devolver las versiones genéricas de estas interfaces: IEnumerable<T> o IQueryable<T>, con el parámetro T igual que el tipo de la propiedad ItemType (por ejemplo, IQueryable<Category>).
El siguiente ejemplo muestra el código del método GetCategories. Este ejemplo usa el modelo Entity Framework Code First con la base de datos de ejemplo Northwind. El código garantiza que la consulta devuelve detalles de los productos relacionados para cada categoría con el método Include. (Esto garantiza que el elemento TemplateField del marcado muestra el recuento de productos de cada categoría sin necesidad de n+1 select.)
public IQueryable<Category>
GetCategories()
{
var db = new Northwind();
return db.Categories.Include(c => c.Products);
}
Cuando se ejecuta la página, el control GridView llama automáticamente al método GetCategories y representa los datos devueltos con el uso de los campos configurados:
Dado que el método select devuelve un objeto IQueryable, el control GridView puede manipular aún más la consulta antes de ejecutarla. Por ejemplo, el control GridView puede agregar expresiones de consulta para ordenar y paginar al objeto IQueryable devuelto antes de que se ejecute, de modo que el proveedor LINQ subyacente hace esas operaciones. En este caso, Entity Framework garantizará que esas operaciones se hagan en la base de datos.
El siguiente ejemplo muestra el control GridView modificado para permitir la ordenación y paginación:
<asp:GridView ID="categoriesGrid"
runat="server"
AutoGenerateColumns="false"
AllowSorting="true" AllowPaging="true" PageSize="5"
ItemType="WebApplication1.Model.Category" DataKeyNames="CategoryID"
SelectMethod="GetCategories"
UpdateMethod="UpdateCategory">
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="ID" SortExpression="CategoryID" />
<asp:BoundField DataField="CategoryName" HeaderText="Name" SortExpression="CategoryName" />
<asp:BoundField DataField="Description" HeaderText="Description" />
<asp:TemplateField HeaderText="# of Products">
<ItemTemplate><%# Item.Products.Count %></ItemTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>No categories found with a product count of
<%# minProductsCount.SelectedValue %></EmptyDataTemplate>
</asp:GridView>
Ahora, cuando se ejecuta la página, el control puede asegurarse de que solo se muestra la página actual de datos y que se ordena según la columna seleccionada:
Para filtrar los datos devueltos, se deben agregar los parámetros al método select. Estos parámetros se rellenarán con el enlace del modelo en tiempo de ejecución y puede usarlos para modificar la consulta antes de devolver datos.
Por ejemplo, suponga que desea permitir que los usuarios filtren productos al escribir una palabra clave en la cadena de consulta. Puede agregar un parámetro al método y actualizar el código para que se use el valor del parámetro:
public IQueryable<Product>
GetProducts(string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
Este código contiene una expresión Where si se proporciona un valor para la palabra clave y, por tanto, devuelve los resultados de la consulta.
Proveedores de valores
El ejemplo anterior especificaba de dónde provenía el valor del parámetro keyword. Para indicar esta información, puede usar un atributo de parámetro. En este ejemplo, puede usar la clase QueryStringAttribute que se encuentra en el espacio de nombres System.Web.ModelBinding:
public IQueryable<Product>
GetProducts([QueryString]string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
Esto indica al enlace de modelos que intente enlazar un valor de la cadena de consulta al parámetro keyword en el tiempo de ejecución. (Esto puede implicar realizar la conversión de tipo, aunque no ocurre en este caso.) Si no se puede proporcionar un valor y el tipo no acepta valores NULL, se produce una excepción.
Los orígenes de los valores de estos métodos se conocen como proveedores de valores y los atributos de parámetro que indican qué proveedor de valores usar se conocen como atributos de proveedor de valores. Web Forms incluirá proveedores de valores y atributos correspondientes de todos los orígenes típicos de entrada de usuario en una aplicación de Web Forms, como la cadena de consulta, cookies, valores de formulario, controles, estado de vista, estado de sesión y propiedades de perfil. También puede escribir proveedores de valores personalizados.
De forma predeterminada, el nombre del parámetro se usa como clave para buscar un valor en la colección de proveedores de valores. En el ejemplo, el código buscará un valor de cadena de consulta con el nombre keyword (por ejemplo, ~/default.aspx?keyword=chef). Puede especificar una clave personalizada al introducirla como argumento en el atributo de parámetro. Por ejemplo, para usar el valor de la variable de cadena de consulta con el nombre q, puede hacer lo siguiente:
public IQueryable<Product>
GetProducts([QueryString("q")]string keyword)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
Si este método está en el código de la página, los usuarios pueden filtrar los resultados al introducir una palabra clave con la cadena de consulta:
El enlace de modelos hace muchas tareas que tendría que codificar manualmente: leer el valor, comprobar un valor null, intentar convertirlo al tipo adecuado, comprobar si la conversión se hizo correctamente y, por último, usar el valor de la consulta. El enlace de modelos supone mucho menos código y la capacidad de reutilizar la funcionalidad en toda la aplicación.
Filtrado según valores de un control
Supongamos que desea ampliar el ejemplo para permitir que el usuario elija un valor de filtro en una lista desplegable. Agregue la siguiente lista desplegable al marcado y configúrela para obtener los datos de otro método con la propiedad SelectMethod:
<asp:Label runat="server" AssociatedControlID="categories"
Text="Select a category to show products for: " />
<asp:DropDownList runat="server" ID="categories"
SelectMethod="GetCategories" AppendDataBoundItems="true"
DataTextField="CategoryName" DataValueField="CategoryID"
AutoPostBack="true">
<asp:ListItem Value="" Text="- all -" />
</asp:DropDownList>
Normalmente, también agregaría un elemento EmptyDataTemplate al control GridView para que el control muestre un mensaje si no se encuentra ningún producto que coincida:
<asp:GridView ID="productsGrid"
runat="server" DataKeyNames="ProductID"
AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false"
SelectMethod="GetProducts" >
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ID" />
<asp:BoundField DataField="ProductName" HeaderText="Name"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price"
SortExpression="UnitPrice" />
<asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock"
SortExpression="UnitsInStock" />
</Columns>
<EmptyDataTemplate>
No products matching the filter criteria were found</EmptyDataTemplate>
</asp:GridView>
En el código de la página, agregue el nuevo método select en la lista desplegable:
public IQueryable<Category>
GetCategories()
{
return _db.Categories;
}
Por último, actualice el método select GetProducts para aceptar un nuevo parámetro que tenga el identificador de la categoría seleccionada en la lista desplegable:
public IQueryable<Product>
GetProducts(
[QueryString("q")] string keyword,
[Control("categories")] int? categoryId)
{
IQueryable<Product> query = _db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
if (categoryId.HasValue && categoryId > 0)
{
query = query.Where(p => p.CategoryID == categoryId);
}
return query;
}
Ahora, cuando se ejecuta la página, los usuarios pueden seleccionar una categoría de la lista desplegable y el control GridView vuelve a enlazar automáticamente para mostrar los datos filtrados. Esto es posible porque el enlace de modelos hace un seguimiento de los valores de los parámetros de los métodos select y detecta si algún valor de parámetro ha cambiado después de un postback. Si es así, el enlace de modelos le obliga al control de datos asociado a volver a enlazar a los datos.
Expresiones de enlace de datos codificadas en HTML
Ahora puede codificar el resultado de las expresiones de enlace de datos en HTML. Agregue dos puntos (:) al final del prefijo <%# que marca la expresión de enlace de datos:
<asp:TemplateField HeaderText="Name">
<ItemTemplate><%#: Item.Products.Name %></ItemTemplate>
</asp:TemplateField>
Validación discreta
Ahora puede configurar los controles de validador integrados para usar JavaScript discreto en la lógica de validación del lado del cliente. Esto reduce significativamente la cantidad de JavaScript representado inline del marcado de página y reduce el tamaño general de la página. Puede configurar JavaScript discreto para los controles de validador de cualquiera de estas maneras:
Globalmente al agregar la siguiente configuración al elemento <appSettings> en el archivo Web.config:
<add name="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
Globalmente al establecer la propiedad estática System.Web.UI.ValidationSettings.UnobtrusiveValidationMode en UnobtrusiveValidationMode.WebForms (normalmente en el método Application_Start en el archivo Global.asax).
Individualmente para una página al establecer la nueva propiedad UnobtrusiveValidationMode de la clase Page en UnobtrusiveValidationMode.WebForms.
Actualizaciones de HTML5
Se han realizado algunas mejoras en los controles de servidor de Web Forms para aprovechar las nuevas características de HTML5:
- La propiedad TextMode del control TextBox se ha actualizado para admitir los nuevos tipos de entrada HTML5, como email, datetime y demás.
- El control FileUpload ya admite varias cargas de archivos desde exploradores que admiten esta característica de HTML5.
- Los controles de validador ya admiten la validación de elementos de entrada HTML5.
- Nuevos elementos de HTML5 con atributos que representan una dirección URL ya admiten runat="server". Como resultado, puede usar convenciones de ASP.NET en las rutas de acceso de dirección URL, como operator, para representar la raíz de la aplicación (por ejemplo, <video runat="server" src="~/myVideo.wmv" />).
- El control UpdatePanel se ha corregido para admitir la publicación de campos de entrada HTML5.
ASP.NET MVC 4
ASP.NET MVC 4 Beta desde ahora se incluye con Visual Studio 11 Beta. ASP.NET MVC es un marco para desarrollar aplicaciones web fáciles de probar y mantener aprovechando el patrón de Controlador de vista de modelo (MVC). ASP.NET MVC 4 facilita la compilación de aplicaciones para la web móvil e incluye la API de ASP.NET Web, lo que le ayuda a crear servicios HTTP que pueden llegar a cualquier dispositivo. Para más información, consulte las Notas de la versión de ASP.NET 4 MVC.
ASP.NET Web Pages 2
Entre las nuevas características se incluyen:
- Plantillas de sitio nuevas y actualizadas.
- Agregación de validación del lado servidor y del cliente con el asistente para validación.
- La capacidad de registrar scripts con un administrador de recursos.
- Habilitación de inicios de sesión desde Facebook u otros sitios con OAuth y OpenID.
- Incoporación de Mapas mediante el asistente para Mapas.
- Ejecución de aplicaciones de páginas web en paralelo.
- Representación de páginas para dispositivos móviles.
Para obtener más información sobre estas características y código de ejemplo de página completa, consulte Mejores características de la beta de páginas web 2.
Beta de Visual Web Developer 11
Esta sección proporciona información sobre las mejoras para el desarrollo web en la beta de Visual Web Developer 11 y la versión candidata para lanzamiento de Visual Studio 2012.
Uso compartido de proyectos entre Visual Studio 2010 y la versión candidata para lanzamiento de Visual Studio 2012 (Compatibilidad de proyectos)
Hasta la versión candidata para lanzamiento de Visual Studio 2012, abrir un proyecto existente en una versión más reciente de Visual Studio iniciaba el Asistente para conversión. Esto obligaba a actualizar el contenido (recursos) de un proyecto y una solución a nuevos formatos no compatibles con versiones anteriores. Por lo tanto, después de la conversión no se podía abrir el proyecto en la versión anterior de Visual Studio.
Muchos clientes nos han dicho que esto no era el enfoque correcto. En la beta de Visual Studio 11, se admite el uso compartido de proyectos y soluciones con Visual Studio 2010 SP1. Lo que significa que si abre un proyecto de 2010 en la versión candidata para lanzamiento de Visual Studio 2012, todavía podrá abrir el proyecto en Visual Studio 2010 SP1.
Nota:
Algunos tipos de proyectos no se pueden compartir entre Visual Studio 2010 SP1 y la versión candidata para lanzamiento de Visual Studio 2012. Estos son algunos proyectos más antiguos (como proyectos ASP.NET de MVC 2) o proyectos con fines especiales (como proyectos de instalación).
Al abrir un proyecto web de Visual Studio 2010 SP1 por primera vez en la beta de Visual Studio 11, se agregan las siguientes propiedades al archivo del proyecto:
- FileUpgradeFlags
- UpgradeBackupLocation
- OldToolsVersion
- VisualStudioVersion
- VSToolsPath
FileUpgradeFlags, UpgradeBackupLocation y OldToolsVersion se usan en el proceso que actualiza el archivo del proyecto. No tienen ningún impacto al trabajar en el proyecto en Visual Studio 2010.
VisualStudioVersion es una nueva propiedad que usa MSBuild 4.5 e indica la versión de Visual Studio del proyecto actual. Dado que esta propiedad no existía en MSBuild 4.0 (la versión de MSBuild de Visual Studio 2010 SP1), insertamos un valor predeterminado en el archivo de proyecto.
La propiedad VSToolsPath se usa para determinar el archivo .targets correcto para importar desde la ruta de acceso que indica la configuración MSBuildExtensionsPath32.
También hay algunos cambios relacionados con los elementos Import. Estos cambios son necesarios para admitir la compatibilidad entre ambas versiones de Visual Studio.
Nota:
Si un proyecto se comparte entre Visual Studio 2010 SP1 y la beta de Visual Studio 11 en dos equipos distintos y, si el proyecto incluye una base de datos local en la carpeta App_Data, debe asegurarse de que la versión de SQL Server que usa la base de datos está instalada en ambos equipos.
Cambios de configuración en plantillas de sitio web de ASP.NET 4.5
Se han realizado los siguientes cambios en el archivo Web.config predeterminado para los sitios creados con plantillas de sitio web en la versión candidata para lanzamiento de Visual Studio 2012:
- En el elemento
<httpRuntime>
, el atributoencoderType
ahora se establece de forma predeterminada para usar los tipos AntiXSS que se agregaron a ASP.NET. Para obtener más información, consulte Biblioteca AntiXSS. - También en el elemento
<httpRuntime>
, el atributorequestValidationMode
se establece en "4.5". Esto significa que, de forma predeterminada, la validación de solicitudes está configurada para usar la validación diferida. Para obtener más información, consulte Nuevas características de validación de solicitudes de ASP.NET. - El elemento
<modules>
de la sección<system.webServer>
no contiene un atributorunAllManagedModulesForAllRequests
. (El valor predeterminado es false.) Esto significa que si usa una versión de IIS 7 no actualizada a SP1, es posible que tenga problemas con el enrutamiento en un sitio nuevo. Para obtener más información, consulte Compatibilidad nativa en IIS 7 para el enrutamiento de ASP.NET.
Estos cambios no afectan a las aplicaciones existentes. Sin embargo, pueden suponer una diferencia en el comportamiento entre los sitios web existentes y los nuevos que cree para ASP.NET 4.5 con las nuevas plantillas.
Compatibilidad nativa en IIS 7 para el enrutamiento de ASP.NET
Esto no es un cambio en ASP.NET como tal, sino un cambio en las plantillas para los nuevos proyectos de sitio web que pueden afectarle si trabaja con una versión de IIS 7 sin la actualización SP1 aplicada.
En ASP.NET, puede agregar la siguiente opción de configuración a las aplicaciones para admitir el enrutamiento:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- more -->
</modules>
</system.webServer>
</configuration>
Cuando runAllManagedModulesForAllRequests es true, una dirección URL como http://mysite/myapp/home
va a ASP.NET, aunque no haya .aspx, .mvc, o una extensión similar en la URL.
Una actualización de IIS 7 hace que la configuración runAllManagedModulesForAllRequests sea innecesaria y admite el enrutamiento ASP.NET de forma nativa. (Para obtener información sobre la actualización, consulte el artículo del Soporte técnico de Microsoft Está disponible una actualización que habilita determinados controladores de IIS 7.0 o IIS 7.5 para controlar las solicitudes cuyas direcciones URL no terminan con un punto.)
Si el sitio web se ejecuta en IIS 7 y IIS se ha actualizado, no es necesario establecer runAllManagedModulesForAllRequests en true. De hecho, no se recomienda establecerlo en true, ya que agrega una sobrecarga de procesamiento innecesaria a la solicitud. Cuando esta configuración es true, todas las solicitudes, entre ellas, las de .htm, .jpg y otros archivos estáticos, también pasan por la canalización de solicitudes de ASP.NET.
Si crea un sitio web de ASP.NET 4.5 con las plantillas proporcionadas en Visual Studio 2012 RC, la configuración del sitio web no incluye el valor runAllManagedModulesForAllRequests. Esto significa que la configuración es false de forma predeterminada.
Si ejecuta el sitio web en Windows 7 sin SP1 instalado, IIS 7 no incluirá la actualización necesaria. Como consecuencia, el enrutamiento no funcionará y verá errores. Si tiene un problema en el que el enrutamiento no funciona, puede hacer lo siguiente:
- Actualice Windows 7 a SP1, lo que le agregará la actualización a IIS 7.
- Instale la actualización de la que habla el artículo de Soporte técnico de Microsoft mencionado anteriormente.
- Establezca runAllManagedModulesForAllRequests en true en el archivo Web.config de ese sitio web. Tenga en cuenta que esto agregará cierta sobrecarga a las solicitudes.
Editor de HTML
Tareas inteligentes
En la vista Diseño, las propiedades complejas de los controles de servidor suelen tener cuadros de diálogo asociados y asistentes para facilitar su establecimiento. Por ejemplo, puede usar un cuadro de diálogo especial para agregar un origen de datos a un control Repeater o agregar columnas a un control GridView.
Sin embargo, este tipo de ayuda de interfaz de usuario de las propiedades complejas no estaba disponible en la vista Código fuente. Por lo tanto, Visual Studio 11 presenta Tareas inteligentes para la vista de Código fuente. Las tareas inteligentes son métodos abreviados contextuales para las características más usadas en los editores de C# y Visual Basic.
En los controles de ASP.NET Web Forms, las tareas inteligentes aparecen en etiquetas de servidor como un glifo pequeño cuando el punto de inserción está dentro del elemento:
La tarea inteligente se expande al hacer clic en el glifo o presionar CTRL+. (punto), al igual que en los editores de código. Luego, muestra accesos directos similares a las tareas inteligentes en la vista Diseño.
Por ejemplo, la tarea inteligente de la imagen anterior muestra las opciones de tareas de GridView. Si elige Editar columnas, se muestra el siguiente cuadro de diálogo:
Al rellenar el cuadro de diálogo se establecen las mismas propiedades que puede establecer en la vista Diseño. Al hacer clic en Aceptar, el marcado del control se actualiza con la nueva configuración:
Soporte técnico de WAI-ARIA
Escribir sitios web accesibles es cada vez más importante. El estándar de accesibilidad WAI-ARIA define cómo los desarrolladores deben escribir sitios web accesibles. Este estándar ya es totalmente compatible con Visual Studio.
Por ejemplo, el atributo role ahora tiene IntelliSense completo:
El estándar WAI-ARIA también presenta atributos con prefijo aria- que permiten agregar semántica a un documento HTML5. Visual Studio también admite totalmente estos atributos aria-:
Nuevos fragmentos de código HTML5
Para agilizar y facilitar la escritura del marcado HTML5 usado frecuentemente, Visual Studio incluye una serie de fragmentos de código. Un ejemplo es el fragmento de código de video:
Para activar el fragmento de código, presione la tecla TAB dos veces cuando el elemento esté seleccionado en IntelliSense:
Esto crea un fragmento de código personalizable.
Extraer a control de usuario
En páginas web grandes, puede ser buena idea mover partes individuales a controles de usuario. Esta forma de refactorización puede ayudar a aumentar la legibilidad de la página y puede simplificar su estructura.
Para facilitarlo, al editar páginas de Web Forms en la vista Origen, ahora puede seleccionar texto en una página, hacer clic con el botón derecho en él y elegir Extraer al control de usuario:
IntelliSense para fragmentos de código en atributos
Visual Studio siempre ha proporcionado IntelliSense en fragmentos de código del lado servidor en cualquier página o control. Ahora, Visual Studio también incluye IntelliSense en fragmentos de código en atributos HTML.
Lo que facilita la creación de expresiones de enlace de datos:
Cambio de nombre automático de la etiqueta coincidente al cambiar el nombre de una etiqueta de apertura o de cierre
Si cambia el nombre de un elemento HTML (por ejemplo, cambia una etiqueta div para que sea una etiqueta header), la etiqueta de apertura o cierre correspondiente también cambia en tiempo real.
Esto ayuda a evitar el error de olvidar cambiar una etiqueta de cierre o cambiar la incorrecta.
Generación del controlador de eventos
Visual Studio ahora incluye características en la vista Origen para ayudarle a escribir controladores de eventos y enlazarlos manualmente. Si edita un nombre de evento en la vista Origen, IntelliSense muestra <Crear nuevo evento>, que creará un controlador de eventos en el código de la página con la firma correcta:
De forma predeterminada, el controlador de eventos usará el identificador del control para el nombre del método de control de eventos:
El controlador de eventos resultante tendrá este aspecto (en este caso, en C#):
Sangría inteligente
Al pulsar Inter dentro de un elemento HTML vacío, el editor colocará el punto de inserción en el lugar correcto:
Si presiona Inter en esta ubicación, la etiqueta de cierre se mueve hacia abajo y se aplica sangría para que coincida con la de apertura. También se le aplica sangría al punto de inserción:
Reducción automática para la finalización de instrucciones
La lista de IntelliSense en Visual Studio ahora filtra según lo que escriba para que solo muestre las opciones pertinentes:
IntelliSense también filtra si el título de las palabras individuales de la lista de IntelliSense está en mayúsculas o minúsculas. Por ejemplo, si escribe "dl", se muestran dl y asp:DataList:
Esta característica acelera la obtención de la finalización de instrucciones de los elementos conocidos.
editor de JavaScript
El editor de JavaScript de la versión candidata para lanzamiento de Visual Studio 2012 es completamente nuevo y mejora considerablemente la experiencia de trabajo con JavaScript en Visual Studio.
Esquematización de código
Las regiones de esquematización ahora se crean automáticamente para todas las funciones, lo que permite contraer partes del archivo que no son pertinentes para el enfoque en ese momento.
Coincidencia de llaves
Al colocar el punto de inserción en una llave de apertura o cierre, el editor resalta el correspondiente.
Ir a definición
El comando Ir a definición le permite ir al origen de una función o variable.
Compatibilidad con ECMAScript5
El editor admite la nueva sintaxis y las API en ECMAScript5, la versión más reciente del estándar que describe el lenguaje JavaScript.
DOM IntelliSense
Se ha mejorado IntelliSense para las API DOM, con compatibilidad con muchas API HTML5 nuevas, como querySelector, almacenamiento DOM, mensajería entre documentos y canvas. Desde ahora, DOM IntelliSense está controlado por un único archivo JavaScript simple, en lugar de por una definición de biblioteca de tipos nativa. Esto facilita la extensión o sustitución.
Sobrecargas de firma de VSDOC
Los comentarios detallados de IntelliSense ya se pueden declarar para sobrecargas independientes de funciones de JavaScript mediante el nuevo elemento<signature>, tal y como se muestra en este ejemplo:
function GetOrSet(key, value) {
/// <signature>
/// <summary>Gets the value</summary>
/// <param name="key" type="String">The key to get the value for</param>
/// <returns type="String" />
/// </signature>
/// <signature>
/// <summary>Sets the value</summary>
/// <param name="key" type="String">The key to set the value for</param>
/// <param name="value" type="String">The value to set</param>
/// <returns type="MyLib" />
/// </signature>
if (value) {
values[key] = value;
return this;
} else {
return values[key];
}
}
Referencias implícitas
Ahora puede agregar archivos JavaScript a una lista central que se incluirá implícitamente en la lista de archivos que referencie cualquier archivo JavaScript o de bloque, lo que significa que obtendrá IntelliSense para su contenido. Por ejemplo, puede agregar archivos jQuery a la lista central de archivos y obtendrá IntelliSense para funciones jQuery en cualquier bloque de archivo de JavaScript, independientemente de si ha hecho referencia a él explícitamente (con /// <reference />) o no.
Editor CSS
Reducción automática para la finalización de instrucciones
La lista de IntelliSense para CSS filtra desde ahora en función de las propiedades y valores css admitidos por el esquema seleccionado.
IntelliSense también admite búsquedas de títulos con mayúsculas y minúsculas:
Aplicación de sangría jerárquica
El editor CSS usa sangría para mostrar reglas jerárquicas, lo que le proporciona una vista general sobre la organización lógicas de las reglas en cascada. En el ejemplo siguiente, el selector #list a es un elemento secundario en cascada de la lista y, por tanto, se le aplica sangría.
El siguiente ejemplo muestra una herencia más compleja:
Las reglas primarias determinan la sangría de una regla. La sangría jerárquica está habilitada de forma predeterminada, pero puede deshabilitarla en el cuadro de diálogo Opciones (Herramientas, Opciones de la barra de menús):
Compatibilidad con hacks de CSS
El análisis de cientos de archivos CSS de uso real muestra que los hacks CSS son muy comunes y Visual Studio ya admite los más usados. Esta compatibilidad incluye IntelliSense y validación de los hacks de propiedad de estrella (*) y subrayado (_):
Los hacks de selectores típicos también se admiten, para que la sangría jerárquica se mantenga incluso cuando se aplican. Un hack de selector típico que se usa para dirigirse a Internet Explorer 7 es anteponer un selector con *:first-child + html. El uso de esa regla mantendrá la sangría jerárquica:
Esquemas específicos de proveedores (-moz-,-webkit)
CSS3 presenta muchas propiedades implementadas por diferentes exploradores en momentos diferentes. Esto anteriormente obligó a los desarrolladores a codificar para exploradores específicos con la sintaxis específica del proveedor. IntelliSense ya incluye estas propiedades específicas del explorador.
Compatibilidad con comentarios y anulación de comentarios
Ahora puede comentar y quitar la marca de comentario de las reglas CSS con los mismos métodos abreviados de teclado del editor de código (Ctrl+K o C para comentar y Ctrl+K o U para quitar la marca de comentario).
Selector de colores
En versiones anteriores de Visual Studio, IntelliSense para los atributos relacionados con el color era una lista desplegable de valores de color con nombre. Esa lista se ha reemplazado por un selector de colores completo.
Al escribir un valor de color, se muestra automáticamente el selector de colores y presenta una lista de los colores usados anteriormente junto con una paleta de colores predeterminada. Puede seleccionar un color con el mouse o teclado.
La lista se puede expandir en un selector de colores completo. El selector le permite controlar el canal alfa con la conversión automática de cualquier color en RGBA al mover el control deslizante de opacidad:
Fragmentos de código
Los fragmentos de código en el editor CSS facilitan y aceleran la creación de estilos entre exploradores. Muchas propiedades de CSS3 que requieren una configuración específica del explorador ya se han inscrito en fragmentos de código.
Los fragmentos de código CSS admiten escenarios avanzados (como media queries de CSS3) escribiendo el símbolo en (@), que muestra la lista de IntelliSense.
Al seleccionar el valor @media y presionar la tecla TAB, el editor CSS inserta el siguiente fragmento de código:
Al igual que con los fragmentos de código, puede crear sus propios fragmentos de código CSS.
Regiones personalizadas
También conocidas como regiones de código, que ya están disponibles en el editor de código, ahora están disponibles para la edición de CSS. Esto le permite agrupar fácilmente bloques de estilo relacionados.
Cuando se contrae una región, se muestra el nombre de la región:
Inspector de página
El Inspector de página es una herramienta que representa una página web (HTML, Web Forms, ASP.NET MVC o páginas web) en el IDE de Visual Studio y le permite examinar el código fuente y la salida resultante. Para las páginas ASP.NET, puede usar el Inspector de página para determinar el código de servidor que ha producido el marcado HTML representado en el explorador.
Para obtener más información sobre el Inspector de página, consulte los siguientes tutoriales:
- Usar el Inspector de página en ASP.NET MVC
- Usar el Inspector de página en los formularios Web Forms de ASP.NET
Publicación
Publicar los perfiles
En Visual Studio 2010, la información de publicación de proyectos de aplicaciones web no se almacena en el control de versiones y no está diseñada para compartirse con otros usuarios. En la versión candidata para lanzamiento de Visual Studio 2012, se ha cambiado el formato del perfil de publicación. Se ha hecho un artefacto de compilación de equipo y desde ahora es fácil aprovechar las compilaciones basadas en MSBuild. La información de configuración de compilación se ubica en el cuadro de diálogo Publicar, para que pueda cambiar las configuraciones de compilación fácilmente antes de publicar.
Los perfiles de publicación se almacenan en la carpeta PublishProfiles. La ubicación de la carpeta depende del lenguaje de programación que use:
- C#: Properties\PublishProfiles
- Visual Basic: Proyecto\PublishProfiles
Cada perfil es un archivo de MSBuild. Durante la publicación, este archivo se importa en el archivo MSBuild del proyecto. En Visual Studio 2010, si desea realizar cambios en el proceso de publicación o empaquetado, debe colocar las personalizaciones en un archivo con el nombre NombredelProyecto.wpp.targets. Esto sigue siendo compatible, pero ya es posible colocar las personalizaciones en el propio perfil de publicación. De este modo, las personalizaciones solo se usarán para ese perfil.
Ahora también puede sacar provecho de los perfiles de publicación de MSBuild. Para ello, use el siguiente comando al compilar el proyecto:
msbuild.exe project.csproj /t:WebPublish /p:PublishProfile=ProfileName
El valor project.csproj es la ruta de acceso del proyecto y ProfileName es el nombre del perfil que se publicará. Como alternativa, en lugar de indicar el nombre de perfil de la propiedad PublishProfile, puede indicar la ruta de acceso completa al perfil de publicación.
Precompilación y combinación de ASP.NET
En el caso de los proyectos de aplicaciones web, la versión candidata para lanzamiento de Visual Studio 2012 agrega una opción en la página de propiedades web Empaquetar o Publicar que le permite precompilar y combinar el contenido del sitio al publicar o empaquetar el proyecto. Para ver estas opciones, haga clic con el botón derecho en el proyecto en el Explorador de soluciones, elija Propiedades y, a continuación, elija la página de propiedades Empaquetar o Publicar Web. La siguiente imagen muestra la opción Precompilar esta aplicación antes de publicar.
Al seleccionar esta opción, Visual Studio precompila la aplicación cada vez que publique o empaquete la aplicación web. Si desea controlar cómo se precompila el sitio o se combinan los ensamblados, haga clic en el botón Avanzado para configurar esas opciones.
IIS Express
El servidor web predeterminado para probar proyectos web en Visual Studio es IIS Express desde ahora. El Servidor de desarrollo de Visual Studio sigue siendo una opción para el servidor web local durante el desarrollo, pero IIS Express es ahora el servidor recomendado. La experiencia de usar IIS Express en la beta de Visual Studio 11 es muy similar a usarlo en Visual Studio 2010 SP1.
Declinación de responsabilidades
Este documento es preliminar y puede cambiar considerablemente antes de la versión comercial final del software que se describe en él.
La información contenida en este documento representa la visión actual de Microsoft Corporation sobre los asuntos tratados a fecha de su publicación. Dado que Microsoft debe responder a condiciones de mercado variables, no debe interpretarse como un compromiso por parte de Microsoft, y Microsoft no puede garantizar la precisión de la información presentada tras la fecha de publicación.
Estas notas del producto solo tienen fines informativos. MICROSOFT NO OTORGA NINGUNA GARANTÍA, EXPRESA, IMPLÍCITA O ESTUTARIAS, EN LA INFORMACIÓN DE ESTE DOCUMENTO.
Es responsabilidad del usuario el cumplimiento de todas las leyes de propiedad intelectual aplicables. Sin perjuicio de los derechos que conforman la legislación de propiedad intelectual, ninguna parte de este documento se puede reproducir, almacenar o incorporar en un sistema de recuperación, ni se puede transmitir de forma alguna o por ningún medio (electrónico, mecánico, fotocopia, grabación o de otro modo) ni para ningún propósito, sin el expreso permiso por escrito de Microsoft Corporation.
Microsoft puede ser titular de patentes, solicitudes de patentes, marcas, derechos de autor y otros derechos de propiedad intelectual sobre los contenidos de este documento. El suministro de este documento no le otorga ninguna licencia sobre estas patentes, marcas, derechos de autor u otros derechos de propiedad intelectual, a menos que ello se prevea en un contrato por escrito de licencia de Microsoft.
A menos que se indique lo contrario, los ejemplos de nombres de compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares y eventos aquí mencionados son ficticios, y no se pretende ni se debe deducir asociación alguna con compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares o eventos reales.
© 2012 Microsoft Corporation. Todos los derechos reservados.
Microsoft y Windows son marcas registradas o marcas comerciales de Microsoft Corporation en Estados Unidos y en otros países.
Los nombres de las compañías y productos reales mencionados en el presente documento pueden ser marcas comerciales de sus respectivos propietarios.