Freigeben über


Neue Funktionen in ASP.NET 4.5 und Visual Studio 2012

In diesem Dokument werden neue Features und Verbesserungen beschrieben, die in ASP.NET 4.5 eingeführt werden. Außerdem werden Verbesserungen für die Webentwicklung in Visual Studio 2012 beschrieben. Dieses Dokument wurde ursprünglich am 29. Februar 2012 veröffentlicht.

ASP.NET Core Runtime und Framework

Asynchrones Lesen und Schreiben von HTTP-Anforderungen und -Antworten

ASP.NET 4 hat die Möglichkeit eingeführt, eine HTTP-Anforderungsentität mithilfe der HttpRequest.GetBufferlessInputStream-Methode zu lesen. Diese Methode hat Streamingzugriff auf die Anforderungsentität bereitgestellt. Sie wird jedoch synchron ausgeführt, wodurch ein Thread für die Dauer einer Anforderung gebunden wird.

ASP.NET 4.5 unterstützt die Möglichkeit, Datenströme asynchron in einer HTTP-Anforderungsentität zu lesen und asynchron zu leeren. ASP.NET 4.5 bietet Ihnen auch die Möglichkeit, eine HTTP-Anforderungsentität zu doppelten Puffern, die eine einfachere Integration mit nachgeschalteten HTTP-Handlern wie .aspx Seitenhandlern und ASP.NET MVC-Controllern ermöglicht.

Verbesserungen bei der HttpRequest-Behandlung

Der stream-Verweis, der von ASP.NET 4.5 von HttpRequest.GetBufferlessInputStream zurückgegeben wird, unterstützt synchrone und asynchrone Lesemethoden. Das stream-Objekt , das von GetBufferlessInputStream zurückgegeben wird, implementiert jetzt sowohl die BeginRead- als auch die EndRead-Methode. Mit den asynchronen Stream-Methoden können Sie die Anforderungsentität in Blöcken asynchron lesen, während ASP.NET den aktuellen Thread zwischen jeder Iteration einer asynchronen Leseschleife loslässt.

ASP.NET 4.5 hat außerdem eine Begleitmethode zum Lesen der Anforderungsentität auf gepufferte Weise hinzugefügt: HttpRequest.GetBufferedInputStream. Diese neue Überladung funktioniert wie GetBufferlessInputStream, die synchrone und asynchrone Lesevorgänge unterstützt. Wie es jedoch liest, kopiert GetBufferedInputStream auch die Entitätsbytes in ASP.NET internen Puffer, sodass nachgeschaltete Module und Handler weiterhin auf die Anforderungsentität zugreifen können. Wenn beispielsweise einige upstream-Code in der Pipeline die Anforderungsentität bereits mit GetBufferedInputStream gelesen hat, können Sie weiterhin HttpRequest.Form oder HttpRequest.Files verwenden. Auf diese Weise können Sie eine asynchrone Verarbeitung für eine Anforderung ausführen (z. B. das Streamen eines großen Dateiuploads in eine Datenbank), aber weiterhin .aspx Seiten und MVC-ASP.NET-Controller danach ausführen.

Asynchrones Leeren einer Antwort

Das Senden von Antworten an einen HTTP-Client kann erhebliche Zeit in Anspruch nehmen, wenn der Client weit entfernt ist oder über eine Verbindung mit geringer Bandbreite verfügt. Normalerweise werden ASP.NET die Antwortbytes beim Erstellen einer Anwendung zwischengespeichert. ASP.NET führt dann einen einzelnen Sendevorgang der fälligen Puffer am Ende der Anforderungsverarbeitung aus.

Wenn die gepufferte Antwort groß ist (z. B. das Streamen einer großen Datei an einen Client), müssen Sie in regelmäßigen Abständen HttpResponse.Flush aufrufen, um die gepufferte Ausgabe an den Client zu senden und die Speicherauslastung unter Kontrolle zu halten. Da Flush jedoch ein synchroner Aufruf ist, verwendet iterativ das Aufrufen von Flush einen Thread für die Dauer potenziell lang ausgeführter Anforderungen.

ASP.NET 4.5 fügt Unterstützung für die asynchrone Ausführung von Flushes mithilfe der BeginFlush- und EndFlush-Methoden der HttpResponse-Klasse hinzu. Mithilfe dieser Methoden können Sie asynchrone Module und asynchrone Handler erstellen, die Daten inkrementell an einen Client senden, ohne Betriebssystemthreads zu binden. Zwischen BeginFlush- und EndFlush-Aufrufen gibt ASP.NET den aktuellen Thread frei. Dadurch wird die Gesamtanzahl der aktiven Threads erheblich reduziert, die benötigt werden, um lange ausgeführte HTTP-Downloads zu unterstützen.

Unterstützung für Await und Task – basierte asynchrone Module und Handler

.NET Framework 4 hat ein asynchrones Programmierkonzept eingeführt, das als Aufgabe bezeichnet wird. Aufgaben werden durch den Aufgabentyp und verwandte Typen im Namespace "System.Threading.Tasks " dargestellt. Das .NET Framework 4.5 baut auf dieser Erweiterung mit Compilererweiterungen auf, die das Arbeiten mit Task-Objekten vereinfachen. In .NET Framework 4.5 unterstützen die Compiler zwei neue Schlüsselwörter: await and async. Das Await-Schlüsselwort ist syntaktische Kurzform, um anzugeben, dass ein Codeabschnitt asynchron auf einen anderen Codeabschnitt warten soll. Das asynchrone Schlüsselwort stellt einen Hinweis dar, mit dem Sie Methoden als aufgabenbasierte asynchrone Methoden markieren können.

Die Kombination aus Await, async und dem Task-Objekt erleichtert es Ihnen, asynchronen Code in .NET 4.5 zu schreiben. ASP.NET 4.5 unterstützt diese Vereinfachungen mit neuen APIs, mit denen Sie asynchrone HTTP-Module und asynchrone HTTP-Handler mithilfe der neuen Compilererweiterungen schreiben können.

Asynchrone HTTP-Module

Angenommen, Sie möchten eine asynchrone Arbeit innerhalb einer Methode ausführen, die ein Task-Objekt zurückgibt. Im folgenden Codebeispiel wird eine asynchrone Methode definiert, die einen asynchronen Aufruf zum Herunterladen der Microsoft-Startseite vorgibt. Beachten Sie die Verwendung des asynchronen Schlüsselworts in der Methodensignatur und den Await-Aufruf von 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
}

Das ist alles, was Sie schreiben müssen – das .NET Framework behandelt automatisch das Entspannen des Aufrufstapels, während der Download abgeschlossen ist, und das automatische Wiederherstellen des Aufrufstapels nach Abschluss des Downloads.

Angenommen, Sie möchten diese asynchrone Methode in einem asynchronen ASP.NET HTTP-Modul verwenden. ASP.NET 4.5 enthält eine Hilfsmethode (EventHandlerTaskAsyncHelper) und einen neuen Delegatentyp (TaskEventHandler), mit dem Sie aufgabenbasierte asynchrone Methoden in das ältere asynchrone Programmiermodell integrieren können, das von der ASP.NET HTTP-Pipeline verfügbar gemacht wird. In diesem Beispiel wird gezeigt, wie:

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

Asynchrone HTTP-Handler

Der herkömmliche Ansatz zum Schreiben asynchroner Handler in ASP.NET besteht darin, die IHttpAsyncHandler-Schnittstelle zu implementieren. ASP.NET 4.5 führt den asynchronen Basistyp "HttpTaskAsyncHandler " ein, von dem Sie ableiten können, was das Schreiben asynchroner Handler erheblich vereinfacht.

Der HttpTaskAsyncHandler-Typ ist abstrakt und erfordert, dass Sie die ProcessRequestAsync-Methode überschreiben. Intern ASP.NET übernimmt die Integration der Rückgabesignatur (ein Task-Objekt ) von ProcessRequestAsync in das ältere asynchrone Programmiermodell, das von der ASP.NET-Pipeline verwendet wird.

Das folgende Beispiel zeigt, wie Sie "Task" verwenden und im Rahmen der Implementierung eines asynchronen HTTP-Handlers warten können:

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

Neue ASP.NET Anforderungsüberprüfungsfeatures

Standardmäßig führt ASP.NET eine Anforderungsüberprüfung durch – es überprüft Anforderungen, nach Markup oder Skript in Feldern, Headern, Cookies usw. zu suchen. Wenn eines erkannt wird, löst ASP.NET eine Ausnahme aus. Dies dient als erste Verteidigungslinie gegen potenzielle websiteübergreifende Skriptingangriffe.

ASP.NET 4.5 erleichtert das selektive Lesen nichtvalidierter Anforderungsdaten. ASP.NET 4.5 integriert auch die beliebte AntiXSS-Bibliothek, die früher eine externe Bibliothek war.

Entwickler haben häufig nach der Möglichkeit gefragt, die Anforderungsüberprüfung für ihre Anwendungen selektiv zu deaktivieren. Wenn Ihre Anwendung z. B. Forumsoftware ist, sollten Sie Es Benutzern ermöglichen, HTML-formatierte Forenbeiträge und Kommentare zu übermitteln, aber dennoch sicherstellen, dass die Anforderungsüberprüfung alles andere überprüft.

ASP.NET 4.5 führt zwei Features ein, mit denen Sie selektiv mit nicht überprüften Eingaben arbeiten können: verzögerte ("lazy") Anforderungsüberprüfung und Zugriff auf nichtvalidierte Anforderungsdaten.

Verzögerte Anforderungsüberprüfung ("lazy")

In ASP.NET 4.5 unterliegen standardmäßig alle Anforderungsdaten der Anforderungsüberprüfung. Sie können die Anwendung jedoch so konfigurieren, dass die Anforderungsüberprüfung zurückstellung, bis Sie tatsächlich auf Anforderungsdaten zugreifen. (Dies wird manchmal als faule Anforderungsüberprüfung bezeichnet, basierend auf Begriffen wie dem faulen Laden für bestimmte Datenszenarien.) Sie können die Anwendung so konfigurieren, dass die verzögerte Überprüfung in der Datei "Web.config" verwendet wird, indem Sie das attribut "requestValidationMode " auf 4.5 im httpRUntime-Element festlegen, wie im folgenden Beispiel gezeigt:

<httpRuntime requestValidationMode="4.5" ... />

Wenn der Anforderungsüberprüfungsmodus auf 4.5 festgelegt ist, wird die Anforderungsüberprüfung nur für einen bestimmten Anforderungswert ausgelöst und nur, wenn ihr Code auf diesen Wert zugreift. Wenn Ihr Code beispielsweise den Wert "Request.Form["forum_post"] abruft, wird die Anforderungsüberprüfung nur für dieses Element in der Formularauflistung aufgerufen. Keines der anderen Elemente in der Formularauflistung wird überprüft. In früheren Versionen von ASP.NET wurde die Anforderungsüberprüfung für die gesamte Anforderungssammlung ausgelöst, wenn auf ein Element in der Auflistung zugegriffen wurde. Das neue Verhalten erleichtert es verschiedenen Anwendungskomponenten, verschiedene Anforderungsdaten zu betrachten, ohne die Anforderungsüberprüfung für andere Teile auszulösen.

Unterstützung für nichtvalidierte Anforderungen

Die Überprüfung der verzögerten Anforderung allein löst das Problem der selektiven Umgehung der Anforderungsüberprüfung nicht. Der Aufruf von Request.Form["forum_post"] löst weiterhin die Anforderungsüberprüfung für diesen spezifischen Anforderungswert aus. Möglicherweise möchten Sie jedoch ohne Überprüfung auf dieses Feld zugreifen, da Sie Markup in diesem Feld zulassen möchten.

Um dies zuzulassen, unterstützt ASP.NET 4.5 jetzt den nichtvalidierten Zugriff, um Daten anzufordern. ASP.NET 4.5 enthält eine neue Unvalidated-Auflistungseigenschaft in der HttpRequest-Klasse . Diese Sammlung bietet Zugriff auf alle gemeinsamen Werte von Anforderungsdaten, z . B. Form, QueryString, Cookies und URL.

Im Forumbeispiel müssen Sie zunächst die Anwendung so konfigurieren, dass sie den neuen Anforderungsüberprüfungsmodus verwendet:

<httpRuntime requestValidationMode="4.5" ...
/>

Anschließend können Sie die HttpRequest.Unvalidated-Eigenschaft verwenden, um den wert des nicht überprüften Formulars zu lesen:

var s = context.Request.Unvalidated.Form["forum_post"];

Warnung

Sicherheit – Verwenden Sie unvalidierte Anforderungsdaten mit Sorgfalt! ASP.NET 4.5 hat die nichtvalidierten Anforderungseigenschaften und -sammlungen hinzugefügt, um ihnen den Zugriff auf sehr spezifische nichtvalidierte Anforderungsdaten zu erleichtern. Sie müssen jedoch weiterhin eine benutzerdefinierte Überprüfung der Rohanforderungsdaten durchführen, um sicherzustellen, dass gefährlicher Text nicht für Benutzer gerendert wird.

AntiXSS-Bibliothek

Aufgrund der Beliebtheit der Microsoft AntiXSS Library enthält ASP.NET 4.5 jetzt Kerncodierungsroutinen aus Version 4.0 dieser Bibliothek.

Die Codierungsroutinen werden vom AntiXssEncoder-Typ im neuen System.Web.Security.AntiXss-Namespace implementiert. Sie können den AntiXssEncoder-Typ direkt verwenden, indem Sie eine der statischen Codierungsmethoden aufrufen, die im Typ implementiert sind. Der einfachste Ansatz für die Verwendung der neuen Anti-XSS-Routinen besteht jedoch darin, eine ASP.NET Anwendung so zu konfigurieren, dass die AntiXssEncoder-Klasse standardmäßig verwendet wird. Fügen Sie hierzu der Datei "Web.config" das folgende Attribut hinzu:

<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Wenn das encoderType-Attribut auf die Verwendung des AntiXssEncoder-Typs festgelegt ist, verwendet alle Ausgabecodierungen in ASP.NET automatisch die neuen Codierungsroutinen.

Dies sind die Teile der externen AntiXSS-Bibliothek, die in ASP.NET 4.5 integriert wurden:

  • HtmlEncode, HtmlFormUrlEncode und HtmlAttributeEncode
  • XmlAttributeEncode und XmlEncode
  • UrlEncode und UrlPathEncode (neu)
  • CssEncode

Unterstützung des WebSockets-Protokolls

WebSockets-Protokoll ist ein standardsbasiertes Netzwerkprotokoll, das definiert, wie sichere bidirektionale Kommunikation zwischen einem Client und einem Server über HTTP eingerichtet wird. Microsoft hat sowohl mit den IETF- als auch mit den W3C-Standardsgremien gearbeitet, um das Protokoll zu definieren. Das WebSockets-Protokoll wird von jedem Client (nicht nur Browser) unterstützt, wobei Microsoft erhebliche Ressourcen investiert, die das WebSockets-Protokoll sowohl auf Client- als auch auf mobilen Betriebssystemen unterstützen.

Das WebSockets-Protokoll erleichtert das Erstellen langer Datenübertragungen zwischen einem Client und einem Server. Beispielsweise ist das Schreiben einer Chatanwendung viel einfacher, da Sie eine echte lange Verbindung zwischen einem Client und einem Server herstellen können. Sie müssen nicht auf Problemumgehungen zurückgreifen, z. B. regelmäßige Abfragen oder HTTP-Long-Polling, um das Verhalten eines Sockets zu simulieren.

ASP.NET 4.5 und IIS 8 umfassen die Unterstützung von WebSockets auf niedriger Ebene, sodass ASP.NET entwickler verwaltete APIs zum asynchronen Lesen und Schreiben von Zeichenfolgen- und Binärdaten in einem WebSockets-Objekt verwenden können. Für ASP.NET 4.5 gibt es einen neuen System.Web.WebSockets-Namespace , der Typen für das Arbeiten mit dem WebSockets-Protokoll enthält.

Ein Browserclient stellt eine WebSockets-Verbindung her, indem ein DOM WebSocket-Objekt erstellt wird, das auf eine URL in einer ASP.NET Anwendung verweist, wie im folgenden Beispiel gezeigt:

socket = new WebSocket("ws://contoso.com/MyWebSocketApplication.ashx");

Sie können WebSockets-Endpunkte in ASP.NET mit jeder Art von Modul oder Handler erstellen. Im vorherigen Beispiel wurde eine ASHX-Datei verwendet, da ASHX-Dateien eine schnelle Möglichkeit zum Erstellen eines Handlers sind.

Gemäß dem WebSockets-Protokoll akzeptiert eine ASP.NET-Anwendung die WebSockets-Anforderung eines Clients, indem angegeben wird, dass die Anforderung von einer HTTP GET-Anforderung auf eine WebSockets-Anforderung aktualisiert werden soll. Hier sehen Sie ein Beispiel:

HttpContext.Current.AcceptWebSocketRequest(// WebSocket delegate goes here)

Die AcceptWebSocketRequest-Methode akzeptiert einen Funktionsdelegat, da ASP.NET die aktuelle HTTP-Anforderung abwickelt und dann die Steuerung an den Funktionsdelegat überträgt. Konzeptionell ähnelt dieser Ansatz der Verwendung von System.Threading.Thread, bei der Sie einen Threadstartdelegat definieren, in dem Hintergrundarbeit ausgeführt wird.

Nachdem ASP.NET und der Client erfolgreich einen WebSockets-Handshake abgeschlossen haben, ruft ASP.NET Ihren Delegaten auf, und die WebSockets-Anwendung wird gestartet. Das folgende Codebeispiel zeigt eine einfache Echoanwendung, die die integrierte WebSockets-Unterstützung in ASP.NET verwendet:

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

Die Unterstützung in .NET 4.5 für das Await-Schlüsselwort und asynchrone aufgabenbasierte Vorgänge eignet sich natürlich für das Schreiben von WebSockets-Anwendungen. Das Codebeispiel zeigt, dass eine WebSockets-Anforderung vollständig asynchron innerhalb ASP.NET ausgeführt wird. Die Anwendung wartet asynchron, bis eine Nachricht von einem Client gesendet wird, indem der Await-Socket aufgerufen wird. ReceiveAsync. Ebenso können Sie eine asynchrone Nachricht an einen Client senden, indem Sie den Await-Socket aufrufen . SendAsync.

Im Browser empfängt eine Anwendung WebSockets-Nachrichten über eine Onmessage-Funktion . Zum Senden einer Nachricht aus einem Browser rufen Sie die Send-Methode des WebSocket-DOM-Typs auf, wie in diesem Beispiel gezeigt:

// 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"));

In Zukunft können wir Updates für diese Funktionalität freigeben, die einige der in dieser Version für WebSockets-Anwendungen erforderlichen Codierungen auf niedriger Ebene abstrahieren.

Bündelung und Minimierung

Mit der Bündelung können Sie einzelne JavaScript- und CSS-Dateien in einem Bündel kombinieren, das wie eine einzelne Datei behandelt werden kann. Die Minimierung komprimiert JavaScript- und CSS-Dateien, indem Leerzeichen und andere nicht erforderliche Zeichen entfernt werden. Diese Features funktionieren mit Webformularen, ASP.NET MVC und Webseiten.

Bündel werden mithilfe der Bundle-Klasse oder einer seiner untergeordneten Klassen, ScriptBundle und StyleBundle erstellt. Nach dem Konfigurieren einer Instanz eines Bündels wird das Bündel für eingehende Anforderungen verfügbar gemacht, indem es einfach einer globalen BundleCollection-Instanz hinzugefügt wird. In den Standardvorlagen wird die Bundlekonfiguration in einer BundleConfig-Datei ausgeführt. Diese Standardkonfiguration erstellt Bündel für alle Kernskripts und CSS-Dateien, die von den Vorlagen verwendet werden.

Bündel werden in Ansichten mithilfe einer von mehreren möglichen Hilfsmethoden referenziert. Um das Rendern unterschiedlicher Markups für ein Bundle im Debug- und Releasemodus zu unterstützen, weisen die ScriptBundle- und StyleBundle-Klassen die Hilfsmethode Render auf. Im Debugmodus generiert Render Markup für jede Ressource im Bundle. Im Releasemodus generiert Render ein einzelnes Markupelement für das gesamte Bundle. Das Umschalten zwischen Debug- und Releasemodus kann erreicht werden, indem das Debug-Attribut des Kompilierungselements in "web.config" geändert wird, wie unten dargestellt:

<system.web>
 <compilation targetframework="4.5" debug="true" />
 ...</system.web>

Darüber hinaus kann die Aktivierung oder Deaktivierung der Optimierung direkt über die BundleTable.EnableOptimizations-Eigenschaft festgelegt werden.

BundleTable.EnableOptimizations = true;

Wenn Dateien gebündelt sind, werden sie zuerst alphabetisch sortiert (wie sie in Projektmappen-Explorer angezeigt werden). Sie werden dann so organisiert, dass bekannte Bibliotheken und ihre benutzerdefinierten Erweiterungen (z. B. jQuery, MooTools und Dojo) zuerst geladen werden. Beispielsweise lautet die endgültige Reihenfolge für die Bündelung des Skriptordners wie oben gezeigt:

  1. jquery-1.6.2.js
  2. jquery-ui.js
  3. jquery.tools.js
  4. a.js

CSS-Dateien werden auch alphabetisch sortiert und dann neu organisiert, sodass reset.css und normalize.css vor einer anderen Datei stehen. Die endgültige Sortierung der Bündelung des oben gezeigten Formatvorlagenordners lautet wie folgt:

  1. reset.css
  2. content.css
  3. forms.css
  4. globals.css
  5. menu.css
  6. styles.css

Leistungsverbesserungen für Webhosting

In .NET Framework 4.5 und Windows 8 werden Features eingeführt, die Ihnen helfen können, eine erhebliche Leistungssteigerung für Webserverworkloads zu erzielen. Dies umfasst eine Reduzierung (bis zu 35 %) sowohl in der Startzeit als auch im Speicherbedarf von Webhostingwebsites, die ASP.NET verwenden.

Wichtige Leistungsfaktoren

Im Idealfall sollten alle Websites aktiv und im Arbeitsspeicher sein, um eine schnelle Antwort auf die nächste Anforderung zu gewährleisten, wann immer es kommt. Zu den Faktoren, die sich auf die Reaktionsfähigkeit der Website auswirken können, gehören:

  • Die Zeit, bis eine Website neu gestartet wird, nachdem ein App-Pool wiederverwendet wurde. Dies ist die Zeit, die zum Starten eines Webserverprozesses für die Website benötigt wird, wenn sich die Websiteassemblys nicht mehr im Arbeitsspeicher befinden. (Die Plattformassemblys befinden sich noch im Arbeitsspeicher, da sie von anderen Websites verwendet werden.) Diese Situation wird als "kalter Standort, warmer Framework-Start" oder einfach "kalter Websitestart" bezeichnet.
  • Wie viel Arbeitsspeicher die Website belegt. Die Bedingungen hierfür sind "Pro Standortspeicherverbrauch" oder "nicht freigegebener Arbeitssatz".

Die neuen Leistungsverbesserungen konzentrieren sich auf beide Faktoren.

Anforderungen für neue Leistungsfeatures

Die Anforderungen für die neuen Features können in diese Kategorien unterteilt werden:

  • Verbesserungen, die auf .NET Framework 4 ausgeführt werden.
  • Verbesserungen, die .NET Framework 4.5 erfordern, aber auf jeder Windows-Version ausgeführt werden können.
  • Verbesserungen, die nur in .NET Framework 4.5 unter Windows 8 verfügbar sind.

Die Leistung erhöht sich bei jeder Verbesserungsstufe, die Sie aktivieren können.

Einige der .NET Framework 4.5-Verbesserungen profitieren von umfassenderen Leistungsfeatures, die auch für andere Szenarien gelten.

Gemeinsame Assemblys freigeben

Anforderung: .NET Framework 4 und Visual Studio 11 Developer Preview SDK

Verschiedene Websites auf einem Server verwenden häufig dieselben Hilfsassemblys (z. B. Assemblys aus einem Starter Kit oder Beispielanwendung). Jede Website verfügt über eine eigene Kopie dieser Assemblys im Bin-Verzeichnis. Obwohl der Objektcode für die Assemblys identisch ist, sind sie physisch getrennt assemblys, sodass jede Assembly separat beim Kaltstandortstart gelesen und separat im Arbeitsspeicher gespeichert werden muss.

Die neue Internierungsfunktion löst diese Ineffizienz und reduziert sowohl RAM-Anforderungen als auch Ladezeit. Mit der Internierung kann Windows eine einzelne Kopie jeder Assembly im Dateisystem beibehalten, und einzelne Assemblys in den Ordnern "Websitecontainer" werden durch symbolische Verknüpfungen zur einzelnen Kopie ersetzt. Wenn eine einzelne Website eine unterschiedliche Version der Assembly benötigt, wird die symbolische Verknüpfung durch die neue Version der Assembly ersetzt, und nur diese Website ist betroffen.

Das Freigeben von Assemblys mit symbolischen Links erfordert ein neues Tool namens aspnet_intern.exe, mit dem Sie den Speicher von internen Assemblys erstellen und verwalten können. Sie wird als Teil des Visual Studio 11 Developer Preview SDK bereitgestellt. (Es funktioniert jedoch auf einem System, das nur das .NET Framework 4 installiert hat, vorausgesetzt, Sie haben das neueste Update installiert.)

Um sicherzustellen, dass alle berechtigten Assemblys interniert wurden, führen Sie aspnet_intern.exe regelmäßig aus (z. B. einmal pro Woche als geplanter Vorgang). Eine typische Verwendung ist wie folgt:

aspnet_intern -mode exec -sourcedir
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files" -interndir C:\ASPNETCommonAssemblies

Um alle Optionen anzuzeigen, führen Sie das Tool ohne Argumente aus.

Verwenden der Multi-Core JIT-Kompilierung für einen schnelleren Start

Anforderung: .NET Framework 4.5

Für den Start einer kalten Website müssen nicht nur Assemblys vom Datenträger gelesen werden, sondern die Website muss JIT-kompiliert werden. Bei einer komplexen Website kann dies erhebliche Verzögerungen hinzufügen. Eine neue allgemeine Technik in .NET Framework 4.5 reduziert diese Verzögerungen, indem JIT-Kompilierung auf verfügbare Prozessorkerne verteilt wird. Dies geschieht so viel und so früh wie möglich mithilfe von Informationen, die während früherer Starts der Website gesammelt wurden. Diese Funktionalität wird von der System.Runtime.ProfileOptimization.StartProfile-Methode implementiert.

DIE JIT-Kompilierung mit mehreren Kernen ist in ASP.NET standardmäßig aktiviert, sodass Sie nichts tun müssen, um dieses Feature zu nutzen. Wenn Sie dieses Feature deaktivieren möchten, nehmen Sie die folgende Einstellung in der Datei "Web.config" vor:

<configuration>
  <!-- ... -->
  <system.web>
<compilation profileGuidedOptimizations="None"  />
  <!-- ... -->

Optimieren der Garbage Collection zur Optimierung des Arbeitsspeichers

Anforderung: .NET Framework 4.5

Sobald eine Website ausgeführt wird, kann die Verwendung des Garbage Collector(GC)-Heaps ein erheblicher Faktor bei der Speicherauslastung sein. Wie jeder Garbage Collector macht .NET Framework GC Kompromisse zwischen CPU-Zeit (Häufigkeit und Bedeutung von Sammlungen) und Arbeitsspeicherverbrauch (zusätzlicher Speicherplatz, der für neue, freigegebene oder freifähige Objekte verwendet wird). Für frühere Versionen haben wir Anleitungen zum Konfigurieren der GC bereitgestellt, um das richtige Gleichgewicht zu erzielen (z. B . siehe ASP.NET 2.0/3.5 Shared Hosting Configuration).

Für .NET Framework 4.5 ist anstelle mehrerer eigenständiger Einstellungen eine workloaddefinierte Konfigurationseinstellung verfügbar, die alle zuvor empfohlenen GC-Einstellungen sowie eine neue Optimierung ermöglicht, die zusätzliche Leistung für den Arbeitssatz pro Standort bietet.

Um die GC-Speicheroptimierung zu aktivieren, fügen Sie der Datei "Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config" die folgende Einstellung hinzu:

<configuration>
  <!-- ... -->
  <runtime>
<performanceScenario value="HighDensityWebHosting"  />
  <!-- ... -->

(Wenn Sie mit den vorherigen Anleitungen für Änderungen an aspnet.config vertraut sind, beachten Sie, dass diese Einstellung die alten Einstellungen ersetzt, z. B. müssen keine gcServer, gcConcurrent usw. festgelegt werden. Sie müssen die alten Einstellungen nicht entfernen.)

Vorabrufen für Webanwendungen

Anforderung: .NET Framework 4.5 unter Windows 8

Für mehrere Versionen enthält Windows eine Technologie, die als Prefetcher bezeichnet wird und die Datenträgerlesekosten für den Anwendungsstart reduziert. Da der Kaltstart hauptsächlich für Clientanwendungen ein Problem darstellt, wurde diese Technologie nicht in Windows Server enthalten, die nur Komponenten enthält, die für einen Server unerlässlich sind. Prefetching ist jetzt in der neuesten Version von Windows Server verfügbar, wo sie den Start einzelner Websites optimieren kann.

Für Windows Server ist der Prefetcher standardmäßig nicht aktiviert. Führen Sie die folgenden Befehle in der Befehlszeile aus, um den Prefetcher für Webhosting mit hoher Dichte zu aktivieren und zu konfigurieren:

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

Um den Prefetcher dann in ASP.NET Anwendungen zu integrieren, fügen Sie der Datei "Web.config" Folgendes hinzu:

<configuration>
  <!-- ... -->
  <system.web>
<compilation enablePrefetchOptimization="true" />
  <!-- ... -->

ASP.NET Web Forms

Stark typisierte Datensteuerelemente

In ASP.NET 4.5 umfassen Webformulare einige Verbesserungen beim Arbeiten mit Daten. Die erste Verbesserung ist stark typierte Datensteuerelemente. Bei Web Forms-Steuerelementen in früheren Versionen von ASP.NET zeigen Sie einen datengebundenen Wert mithilfe von Eval und einem Datenbindungsausdruck an:

<ul>
<asp:Repeater runat="server" ID="customers">
       <ItemTemplate>
           <li>
               First Name: <%# Eval("FirstName")%><br />
               Last Name: <%# Eval("LastName")%><br />
           </li>
       </ItemTemplate>
</asp:Repeater>
</ul>

Für die bidirektionale Datenbindung verwenden Sie 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>

Zur Laufzeit verwenden diese Aufrufe Spiegelung, um den Wert des angegebenen Elements zu lesen und dann das Ergebnis im Markup anzuzeigen. Dieser Ansatz erleichtert das Binden von Daten an beliebige, nicht formatierte Daten.

Datenbindungsausdrücke wie dies unterstützen jedoch keine Features wie IntelliSense für Membernamen, navigation (z. B. Gehe zu Definition) oder die Kompilierungszeitüberprüfung für diese Namen.

Um dieses Problem zu beheben, fügt ASP.NET 4.5 die Möglichkeit hinzu, den Datentyp der Daten zu deklarieren, an die ein Steuerelement gebunden ist. Dazu verwenden Sie die neue ItemType-Eigenschaft . Wenn Sie diese Eigenschaft festlegen, stehen zwei neue Typvariablen im Bereich von Datenbindungsausdrücken zur Verfügung: Item und BindItem. Da die Variablen stark typisch sind, profitieren Sie von den vollständigen Vorteilen der Visual Studio-Entwicklungsumgebung.

Verwenden Sie für bidirektionale Datenbindungsausdrücke die BindItem-Variable :

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

Die meisten Steuerelemente im ASP.NET Web Forms-Framework, die die Datenbindung unterstützen, wurden aktualisiert, um die ItemType-Eigenschaft zu unterstützen.

Modellbindung

Die Modellbindung erweitert die Datenbindung in ASP.NET Web Forms-Steuerelementen, um mit codeorientiertem Datenzugriff zu arbeiten. Es enthält Konzepte aus dem ObjectDataSource-Steuerelement und aus der Modellbindung in ASP.NET MVC.

Auswählen von Daten

Zum Konfigurieren eines Datensteuerelements zum Verwenden der Modellbindung zum Auswählen von Daten legen Sie die SelectMethod-Eigenschaft des Steuerelements auf den Namen einer Methode im Code der Seite fest. Das Datensteuerelement ruft die Methode zur entsprechenden Zeit im Seitenlebenszyklus auf und bindet die zurückgegebenen Daten automatisch. Es ist nicht erforderlich, die DataBind-Methode explizit aufzurufen.

Im folgenden Beispiel ist das GridView-Steuerelement so konfiguriert, dass eine Methode namens "GetCategories" verwendet wird:

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

Sie erstellen die GetCategories-Methode im Code der Seite. Für einen einfachen Auswahlvorgang benötigt die Methode keine Parameter und sollte ein IEnumerable - oder IQueryable-Objekt zurückgeben. Wenn die neue ItemType-Eigenschaft festgelegt ist (was stark typierte Datenbindungsausdrücke ermöglicht, wie weiter oben unter "Stark typierte Datensteuerelemente" erläutert), sollten die generischen Versionen dieser Schnittstellen zurückgegeben werden – IEnumerable<T> oder IQueryable<T>, wobei der T-Parameter dem Typ der ItemType-Eigenschaft entspricht (z. B. IQueryable<Category>).

Das folgende Beispiel zeigt den Code für eine GetCategories-Methode . In diesem Beispiel wird das Entity Framework Code First-Modell mit der Northwind-Beispieldatenbank verwendet. Der Code stellt sicher, dass die Abfrage Details der zugehörigen Produkte für jede Kategorie über die Include-Methode zurückgibt. (Dadurch wird sichergestellt, dass die Das TemplateField-Element im Markup zeigt die Anzahl der Produkte in jeder Kategorie an, ohne dass eine Auswahl von n+1 erforderlich ist.)

public IQueryable<Category>
GetCategories()
{
    var db = new Northwind();
    return db.Categories.Include(c => c.Products);
}

Wenn die Seite ausgeführt wird, ruft das GridView-Steuerelement die GetCategories-Methode automatisch auf und rendert die zurückgegebenen Daten mithilfe der konfigurierten Felder:

Screenshot einer Rasteransicht einer Liste von Lebensmitteln nach Kategorie. Es gibt acht Lebensmittelkategorien.

Da die Select-Methode ein IQueryable-Objekt zurückgibt, kann das GridView-Steuerelement die Abfrage weiter bearbeiten, bevor sie ausgeführt wird. Beispielsweise kann das GridView-Steuerelement Abfrageausdrücke zum Sortieren und Paging zum zurückgegebenen IQueryable-Objekt hinzufügen, bevor es ausgeführt wird, sodass diese Vorgänge vom zugrunde liegenden LINQ-Anbieter ausgeführt werden. In diesem Fall stellt Entity Framework sicher, dass diese Vorgänge in der Datenbank ausgeführt werden.

Das folgende Beispiel zeigt das geänderte GridView-Steuerelement , um Sortierung und Paging zu ermöglichen:

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

Wenn die Seite nun ausgeführt wird, kann das Steuerelement sicherstellen, dass nur die aktuelle Datenseite angezeigt wird und dass es von der ausgewählten Spalte sortiert wird:

Screenshot einer Rasteransicht einer Liste von Lebensmitteln nach Kategorie. Es gibt drei Kategorien, Konditoreien, Kondimente und Getränke.

Um die zurückgegebenen Daten zu filtern, müssen der Select-Methode Parameter hinzugefügt werden. Diese Parameter werden zur Laufzeit von der Modellbindung aufgefüllt, und Sie können sie verwenden, um die Abfrage vor dem Zurückgeben der Daten zu ändern.

Angenommen, Sie möchten Benutzern das Filtern von Produkten ermöglichen, indem Sie ein Schlüsselwort in die Abfragezeichenfolge eingeben. Sie können der Methode einen Parameter hinzufügen und den Code so aktualisieren, dass er den Parameterwert verwendet:

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

Dieser Code enthält einen Where-Ausdruck , wenn ein Wert für das Schlüsselwort bereitgestellt wird, und gibt dann die Abfrageergebnisse zurück.

Wertanbieter

Im vorherigen Beispiel wurde nicht angegeben, wo der Wert für den Schlüsselwortparameter stammt. Um diese Informationen anzugeben, können Sie ein Parameter-Attribut verwenden. In diesem Beispiel können Sie die QueryStringAttribute-Klasse verwenden, die sich im System.Web.ModelBinding-Namespace befindet:

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

Dadurch wird die Modellbindung angewiesen, einen Wert aus der Abfragezeichenfolge zur Laufzeit an den Schlüsselwortparameter zu binden. (Dies kann die Ausführung der Typkonvertierung umfassen, obwohl dies in diesem Fall nicht der Fall ist.) Wenn kein Wert angegeben werden kann und der Typ nicht nullfähig ist, wird eine Ausnahme ausgelöst.

Die Wertequellen für diese Methoden werden als Wertanbieter bezeichnet, und die Parameterattribute, die angeben, welcher Wertanbieter verwendet werden soll, werden als Wertanbieterattribute bezeichnet. Web Forms enthält Wertanbieter und entsprechende Attribute für alle typischen Quellen der Benutzereingabe in einer Webanwendung, z. B. die Abfragezeichenfolge, Cookies, Formularwerte, Steuerelemente, Ansichtszustand, Sitzungszustand und Profileigenschaften. Sie können auch benutzerdefinierte Wertanbieter schreiben.

Standardmäßig wird der Parametername als Schlüssel verwendet, um einen Wert in der Wertanbieterauflistung zu finden. Im Beispiel sucht der Code nach einem Abfragezeichenfolgenwert namens Schlüsselwort (z. B. ~/default.aspx?keyword=chef). Sie können einen benutzerdefinierten Schlüssel angeben, indem Sie ihn als Argument an das Parameterattribute übergeben. Um z. B. den Wert der Abfragezeichenfolgenvariable q zu verwenden, können Sie dies tun:

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

Wenn sich diese Methode im Code der Seite befindet, können Benutzer die Ergebnisse filtern, indem sie ein Schlüsselwort mithilfe der Abfragezeichenfolge übergeben:

Screenshot eines Browsers auf der Seite

Die Modellbindung führt viele Aufgaben durch, die Sie sonst manuell codieren müssten: Lesen des Werts, Überprüfen auf einen NULL-Wert, Versuch, ihn in den entsprechenden Typ zu konvertieren, zu überprüfen, ob die Konvertierung erfolgreich war, und schließlich den Wert in der Abfrage zu verwenden. Die Modellbindung führt zu viel weniger Code und der Möglichkeit, die Funktionalität in der gesamten Anwendung wiederzuverwenden.

Filtern nach Werten aus einem Steuerelement

Angenommen, Sie möchten das Beispiel erweitern, damit der Benutzer einen Filterwert aus einer Dropdownliste auswählen kann. Fügen Sie die folgende Dropdownliste zum Markup hinzu, und konfigurieren Sie sie so, dass sie ihre Daten aus einer anderen Methode mithilfe der SelectMethod-Eigenschaft abrufen:

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

In der Regel fügen Sie dem GridView-Steuerelement auch ein EmptyDataTemplate-Element hinzu, sodass das Steuerelement eine Meldung anzeigt, wenn keine übereinstimmenden Produkte gefunden werden:

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

Fügen Sie im Seitencode die neue Select-Methode für die Dropdownliste hinzu:

public IQueryable<Category>
GetCategories()
{
    return _db.Categories;
}

Aktualisieren Sie schließlich die GetProducts-Auswahlmethode , um einen neuen Parameter zu verwenden, der die ID der ausgewählten Kategorie aus der Dropdownliste enthält:

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

Wenn die Seite nun ausgeführt wird, können Benutzer eine Kategorie aus der Dropdownliste auswählen, und das GridView-Steuerelement wird automatisch erneut gebunden, um die gefilterten Daten anzuzeigen. Dies ist möglich, da die Modellbindung die Werte von Parametern für ausgewählte Methoden nachverfolgt und erkennt, ob sich ein Parameterwert nach einem Postback geändert hat. Wenn ja, erzwingt die Modellbindung, dass das zugeordnete Datensteuerelement erneut an die Daten gebunden wird.

Screenshot einer Rasteransicht einer Liste der Süßwaren nach I D, Name, Einzelpreis und Nummer auf Lager.

HTML-Codierte Datenbindungsausdrücke

Sie können nun das Ergebnis von Datenbindungsausdrücken htmlcodieren. Fügen Sie einen Doppelpunkt hinzu (:) am Ende des <Präfixes "%#", das den Datenbindungsausdruck kennzeichnet:

<asp:TemplateField HeaderText="Name">
<ItemTemplate><%#: Item.Products.Name %></ItemTemplate>
</asp:TemplateField>

Unauffällige Überprüfung

Sie können jetzt die integrierten Validator-Steuerelemente so konfigurieren, dass unauffälliges JavaScript für clientseitige Validierungslogik verwendet wird. Dadurch wird die Menge der im Seitenmarkup gerenderten JavaScript-Code erheblich reduziert und die Gesamtgröße der Seite reduziert. Sie können unauffälliges JavaScript für Validator-Steuerelemente auf eine der folgenden Arten konfigurieren:

  • Globally by adding the following setting to the <appSettings> element in the Web.config file:

    <add name="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />
    
  • Globally by setting the static System.Web.UI.ValidationSettings.UnobtrusiveValidationMode property to UnobtrusiveValidationMode.WebForms (typically in the Application_Start method in the Global.asax file).

  • Einzeln für eine Seite durch Festlegen der neuen UnobtrusiveValidationMode-Eigenschaft der Page-Klasse auf "UnobtrusiveValidationMode.WebForms".

HTML5-Updates

Einige Verbesserungen wurden an Web Forms-Serversteuerelementen vorgenommen, um neue Features von HTML5 zu nutzen:

  • Die TextMode-Eigenschaft des TextBox-Steuerelements wurde aktualisiert, um die neuen HTML5-Eingabetypen wie E-Mail, Datetime usw. zu unterstützen.
  • Das FileUpload-Steuerelement unterstützt jetzt mehrere Dateiuploads von Browsern, die dieses HTML5-Feature unterstützen.
  • Validator-Steuerelemente unterstützen jetzt die Überprüfung von HTML5-Eingabeelementen.
  • Neue HTML5-Elemente mit Attributen, die eine URL darstellen, unterstützen jetzt runat="server". Daher können Sie ASP.NET Konventionen in URL-Pfaden verwenden, z. B. den ~-Operator, um den Anwendungsstamm darzustellen (z <. B. Video runat="server" src="~/myVideo.wmv" />).
  • Das UpdatePanel-Steuerelement wurde behoben, um das Bereitstellen von HTML5-Eingabefeldern zu unterstützen.

ASP.NET MVC 4

ASP.NET MVC 4 Beta ist jetzt in Visual Studio 11 Beta enthalten. ASP.NET MVC ist ein Framework für die Entwicklung von hochgradig testbaren und wartungsfähigen Webanwendungen, indem das Model-View-Controller (MVC)-Muster verwendet wird. ASP.NET MVC 4 erleichtert das Erstellen von Anwendungen für das mobile Web und umfasst ASP.NET-Web-API, wodurch Sie HTTP-Dienste erstellen können, die jedes Gerät erreichen können. Weitere Informationen finden Sie in den ASP.NET MVC 4 Versionshinweisen.

ASP.NET-Webseiten 2

Zu den neuen Features gehören:

  • Neue und aktualisierte Websitevorlagen.
  • Hinzufügen der serverseitigen und clientseitigen Überprüfung mithilfe der Überprüfungshilfe .
  • Die Möglichkeit, Skripts mithilfe eines Ressourcen-Managers zu registrieren.
  • Aktivieren von Anmeldungen von Facebook und anderen Websites mithilfe von OAuth und OpenID.
  • Hinzufügen von Karten mithilfe des Kartenhilfsprogramms .
  • Parallele Ausführung von Webseitenanwendungen.
  • Rendern von Seiten für mobile Geräte.

Weitere Informationen zu diesen Features und Vollständigseitencodebeispielen finden Sie unter "Die wichtigsten Features in Webseiten 2 Beta".

Visual Web Developer 11 Beta

Dieser Abschnitt enthält Informationen zu Verbesserungen für die Webentwicklung in Visual Web Developer 11 Beta und Visual Studio 2012 Release Candidate.

Project Sharing Between Visual Studio 2010 and Visual Studio 2012 Release Candidate (Project Compatibility)

Bis Visual Studio 2012 Release Candidate, ein vorhandenes Projekt in einer neueren Version von Visual Studio zu öffnen, wurde der Konvertierungs-Assistent gestartet. Dadurch wurde ein Upgrade des Inhalts (Ressourcen) eines Projekts und einer Lösung auf neue Formate erzwungen, die nicht abwärtskompatibel waren. Daher konnten Sie das Projekt nach der Konvertierung in der älteren Version von Visual Studio nicht öffnen.

Viele Kunden haben uns gesagt, dass dies nicht der richtige Ansatz war. In Visual Studio 11 Beta unterstützen wir jetzt das Freigeben von Projekten und Lösungen mit Visual Studio 2010 SP1. Dies bedeutet: Wenn Sie ein 2010-Projekt in Visual Studio 2012 Release Candidate öffnen, können Sie das Projekt weiterhin in Visual Studio 2010 SP1 öffnen.

Hinweis

Einige Arten von Projekten können nicht zwischen Visual Studio 2010 SP1 und Visual Studio 2012 Release Candidate freigegeben werden. Dazu gehören einige ältere Projekte (z. B. ASP.NET MVC 2-Projekte) oder Projekte für besondere Zwecke (z. B. Setupprojekte).

Wenn Sie ein Visual Studio 2010 SP1-Webprojekt zum ersten Mal in Visual Studio 11 Beta öffnen, werden der Projektdatei die folgenden Eigenschaften hinzugefügt:

  • FileUpgradeFlags
  • UpgradeBackupLocation
  • OldToolsVersion
  • VisualStudioVersion
  • VSToolsPath

FileUpgradeFlags, UpgradeBackupLocation und OldToolsVersion werden vom Prozess verwendet, mit dem die Projektdatei aktualisiert wird. Sie haben keine Auswirkungen auf die Arbeit mit dem Projekt in Visual Studio 2010.

VisualStudioVersion ist eine neue Eigenschaft, die von MSBuild 4.5 verwendet wird, die die Version von Visual Studio für das aktuelle Projekt angibt. Da diese Eigenschaft in MSBuild 4.0 nicht vorhanden war (die Version von MSBuild, die Visual Studio 2010 SP1 verwendet), fügen wir einen Standardwert in die Projektdatei ein.

Die VSToolsPath-Eigenschaft wird verwendet, um die richtige ZIELDATEI zu bestimmen, die aus dem Pfad importiert werden soll, der durch die MSBuildExtensionsPath32-Einstellung dargestellt wird.

Es gibt auch einige Änderungen im Zusammenhang mit Importelementen. Diese Änderungen sind erforderlich, um die Kompatibilität zwischen beiden Versionen von Visual Studio zu unterstützen.

Hinweis

Wenn ein Projekt zwischen Visual Studio 2010 SP1 und Visual Studio 11 Beta auf zwei verschiedenen Computern gemeinsam verwendet wird und wenn das Projekt eine lokale Datenbank im Ordner App_Data enthält, müssen Sie sicherstellen, dass die von der Datenbank verwendete VERSION von SQL Server auf beiden Computern installiert ist.

Konfigurationsänderungen in ASP.NET 4.5-Websitevorlagen

Die folgenden Änderungen wurden an der Standarddatei "Web.config " für Website vorgenommen, die mithilfe von Websitevorlagen in Visual Studio 2012 Release Candidate erstellt werden:

  • <httpRuntime> Im Element ist das encoderType Attribut jetzt standardmäßig auf die Verwendung der AntiXSS-Typen festgelegt, die zu ASP.NET hinzugefügt wurden. Ausführliche Informationen finden Sie unter AntiXSS Library.
  • Auch im <httpRuntime> Element wird das requestValidationMode Attribut auf "4.5" festgelegt. Dies bedeutet, dass die Anforderungsüberprüfung standardmäßig so konfiguriert ist, dass die verzögerte Überprüfung ("faul") verwendet wird. Ausführliche Informationen finden Sie unter "Neue ASP.NET Anforderungsüberprüfungsfeatures".
  • Das <modules> Element des <system.webServer> Abschnitts enthält runAllManagedModulesForAllRequests kein Attribut. (Der Standardwert ist false.) Dies bedeutet, dass bei Verwendung einer Version von IIS 7, die nicht auf SP1 aktualisiert wurde, Probleme mit dem Routing an einem neuen Standort auftreten. Weitere Informationen finden Sie unter nativer Unterstützung in IIS 7 für ASP.NET Routing.

Diese Änderungen wirken sich nicht auf vorhandene Anwendungen aus. Sie können jedoch einen Unterschied im Verhalten zwischen vorhandenen Websites und neuen Websites darstellen, die Sie für ASP.NET 4.5 mithilfe der neuen Vorlagen erstellen.

Native Unterstützung in IIS 7 für ASP.NET Routing

Dies ist keine Änderung an ASP.NET, aber eine Änderung der Vorlagen für neue Websiteprojekte, die sich auf Sie auswirken können, wenn Sie eine Version von IIS 7 arbeiten, auf die das SP1-Update nicht angewendet wurde.

In ASP.NET können Sie die folgende Konfigurationseinstellung zu Anwendungen hinzufügen, um Routing zu unterstützen:

<configuration>
  <system.webServer>
<modules runAllManagedModulesForAllRequests="true">
     <!-- more -->
</modules>
  </system.webServer>
</configuration>

Wenn runAllManagedModulesForAllRequests true ist, wird eine URL wie http://mysite/myapp/home zu ASP.NET, auch wenn keine .aspx, MVC oder ähnliche Erweiterung auf der URL vorhanden ist.

Ein Update, das an IIS 7 vorgenommen wurde, macht die Einstellung "runAllManagedModulesForAllRequests" unnötig und unterstützt ASP.NET natives Routing. (Informationen zum Update finden Sie im Microsoft-Support Artikel Ein Update ist verfügbar, mit dem bestimmte IIS 7.0- oder IIS 7.5-Handler Anforderungen verarbeiten können, deren URLs nicht mit einem Punkt enden.)

Wenn Ihre Website unter IIS 7 ausgeführt wird und IIS aktualisiert wurde, müssen Sie "runAllManagedModulesForAllRequestsForAllRequests" nicht auf "true" festlegen. Tatsächlich wird das Festlegen auf "true" nicht empfohlen, da es unnötigen Verarbeitungsaufwand zur Anforderung hinzufügt. Wenn diese Einstellung zutrifft, durchlaufen alle Anforderungen, einschließlich der Anforderungen für .htm, .jpg und andere statische Dateien, auch die ASP.NET Anforderungspipeline.

Wenn Sie eine neue ASP.NET 4.5-Website mithilfe der Vorlagen erstellen, die in Visual Studio 2012 RC bereitgestellt werden, enthält die Konfiguration für die Website nicht die Einstellung runAllManagedModulesForAllRequests . Dies bedeutet, dass die Einstellung standardmäßig "false" ist.

Wenn Sie dann die Website unter Windows 7 ausführen, ohne SP1 installiert zu haben, enthält IIS 7 nicht das erforderliche Update. Daher funktioniert das Routing nicht, und Es werden Fehler angezeigt. Wenn Sie ein Problem haben, bei dem routing nicht funktioniert, können Sie eine der folgenden Aktionen ausführen:

  • Aktualisieren Sie Windows 7 auf SP1, wodurch das Update zu IIS 7 hinzugefügt wird.
  • Installieren Sie das update, das im zuvor aufgeführten Microsoft-Support Artikel beschrieben wird.
  • Legen Sie "runAllManagedModulesForAllRequests " in der Datei "Web.config" dieser Website auf "true" fest. Beachten Sie, dass dadurch mehr Aufwand für Anforderungen hinzugefügt wird.

HTML-Editor

Intelligente Aufgaben

In der Entwurfsansicht verfügen komplexe Eigenschaften von Serversteuerelementen häufig über zugeordnete Dialogfelder und Assistenten, um sie einfach festzulegen. Sie können z. B. ein spezielles Dialogfeld verwenden, um einem Repeater-Steuerelement eine Datenquelle hinzuzufügen oder einem GridView-Steuerelement Spalten hinzuzufügen.

Diese Art von Ui-Hilfe für komplexe Eigenschaften ist jedoch in der Quellansicht nicht verfügbar. Daher führt Visual Studio 11 intelligente Aufgaben für die Quellansicht ein. Intelligente Aufgaben sind kontextabhängige Tastenkombinationen für häufig verwendete Features in den C#- und Visual Basic-Editoren.

Bei ASP.NET Web Forms-Steuerelementen werden intelligente Aufgaben auf Servertags als kleine Glyphe angezeigt, wenn sich die Einfügemarke innerhalb des Elements befindet:

Screenshot der Servertags als kleine Glyphe, wenn sich die Einfügemarke innerhalb des Elements befindet.

Der intelligente Vorgang wird erweitert, wenn Sie auf die Glyphe klicken oder STRG+drücken. (punkt), genau wie in den Code-Editoren. Anschließend werden Verknüpfungen angezeigt, die der Entwurfsansicht "Intelligente Aufgaben" ähneln.

Screenshot eines Fensters

Beispielsweise zeigt die Smart Task in der vorherigen Abbildung die GridView-Aufgabenoptionen. Wenn Sie "Spalten bearbeiten" auswählen, wird das folgende Dialogfeld angezeigt:

Screenshot eines Dialogfelds

Wenn Sie das Dialogfeld ausfüllen, werden dieselben Eigenschaften festgelegt, die Sie in der Entwurfsansicht festlegen können. Wenn Sie auf "OK" klicken, wird das Markup für das Steuerelement mit den neuen Einstellungen aktualisiert:

Screenshot des Markups für das Steuerelement, das mit neuen Einstellungen aktualisiert wurde.

WAI-ARIA-Unterstützung

Das Schreiben barrierefreier Websites wird immer wichtiger. Der WAI-ARIA-Standard definiert, wie Entwickler barrierefreie Websites schreiben sollten. Dieser Standard wird jetzt vollständig in Visual Studio unterstützt.

Beispielsweise verfügt das Rollenattribute jetzt über vollständige IntelliSense:For example, the role attribute now has full IntelliSense:

Screenshot mit hervorgehobenem Menüelement in einer Liste als Role-Attribut.

Mit dem WAI-ARIA-Standard werden auch Attribute eingeführt, die mit Aria präfixiert werden. So können Sie einem HTML5-Dokument Semantik hinzufügen. Visual Studio unterstützt auch diese Aria-Attribute vollständig:

Screenshot, der die Aria-Attribute zeigt. Der Aria-Drop-Effekt wird in der Attributliste ausgewählt. Screenshot, der die Attribute des Aria-Drop-Effekts mit ausgewählter Kopie zeigt.

Neue HTML5-Codeausschnitte

Damit das häufig verwendete HTML5-Markup schneller und einfacher geschrieben werden kann, enthält Visual Studio eine Reihe von Codeausschnitten. Ein Beispiel ist der Videoausschnitt:

Screenshot eines ausgewählten Visual Studio-Videoausschnitts.

Um den Codeausschnitt aufzurufen, drücken Sie zweimal die TAB-TASTE, wenn das Element in IntelliSense ausgewählt ist:

Screenshot der in IntelliSense ausgewählten Elementdatei.

Dadurch wird ein Codeausschnitt erzeugt, den Sie anpassen können.

Extrahieren in das Benutzersteuerelement

Auf großen Webseiten kann es sinnvoll sein, einzelne Teile in Benutzersteuerelemente zu verschieben. Diese Form der Umgestaltung kann dazu beitragen, die Lesbarkeit der Seite zu erhöhen und die Seitenstruktur zu vereinfachen.

Um dies zu vereinfachen, können Sie nun beim Bearbeiten von Webseiten in der Quellansicht Text auf einer Seite markieren, mit der rechten Maustaste darauf klicken und dann "In Benutzersteuerelement extrahieren" auswählen:

Screenshot mit ausgewählter Option

IntelliSense für Code-Nuggets in Attributen

Visual Studio hat IntelliSense immer für serverseitige Code-Nuggets in einer beliebigen Seite oder einem Steuerelement bereitgestellt. Jetzt enthält Visual Studio IntelliSense für Code-Nuggets auch in HTML-Attributen.

Screenshot, der die in einer Liste ausgewählte Abfragezeichenfolge zeigt.

Dies erleichtert das Erstellen von Datenbindungsausdrücken:

Screenshot, der die Option

Automatische Umbenennung des übereinstimmenden Tags beim Umbenennen eines öffnenden oder schließenden Tags

Wenn Sie ein HTML-Element umbenennen (z. B. ändern Sie ein div-Tag in ein Headertag ), ändert sich auch das entsprechende öffnende oder schließende Tag in Echtzeit.

Screenshot, der zeigt, wie sich die öffnenden und schließenden Tags in Echtzeit ändern. Das Wort

Dadurch wird der Fehler vermieden, bei dem Sie vergessen, ein schließende Tag zu ändern oder das falsche zu ändern.

Ereignishandlergenerierung

Visual Studio enthält jetzt Features in der Quellansicht, mit denen Sie Ereignishandler schreiben und manuell binden können. Wenn Sie einen Ereignisnamen in der Quellansicht bearbeiten, zeigt IntelliSense "Neues Ereignis> erstellen" an<, wodurch ein Ereignishandler im Code der Seite mit der richtigen Signatur erstellt wird:

Screenshot, der die Einfügemarke

Standardmäßig verwendet der Ereignishandler die ID des Steuerelements für den Namen der Ereignisbehandlungsmethode:

Screenshot der I D des Steuerelements für den Namen der Ereignisbehandlungsmethode.

Der resultierende Ereignishandler sieht wie folgt aus (in diesem Fall in C#):

Screenshot des resultierenden Ereignishandlers in C sharp.

Intelligenter Einzug

Wenn Sie während eines leeren HTML-Elements die EINGABETASTE drücken, platziert der Editor die Einfügemarke an der richtigen Stelle:

Screenshot einer Einfügemarke zwischen zwei H T M L-Elementen.

Wenn Sie an diesem Speicherort die EINGABETASTE drücken, wird das schließende Tag nach unten verschoben und eingezogen, um dem öffnenden Tag zu entsprechen. Die Einfügemarke wird ebenfalls eingerückt:

Screenshot, der zeigt, dass das schließende Tag nach unten verschoben und eingezogen wird, um dem öffnenden Tag zu entsprechen. Die Einfügemarke wird ebenfalls eingerückt.

Abschluss der Anweisung automatisch reduzieren

Die IntelliSense-Liste in Visual Studio filtert jetzt basierend auf dem, was Sie eingeben, sodass nur relevante Optionen angezeigt werden:

Screenshot, der die Wortzuordnung zeigt, die in einer IntelliSense-Liste ausgewählt ist.

IntelliSense filtert auch basierend auf der Titelschreibung der einzelnen Wörter in der IntelliSense-Liste. Wenn Sie beispielsweise "dl" eingeben, werden sowohl dl als auch asp:DataList angezeigt:

Screenshot, der d l ausgewählt hat, weil er eingegeben wurde.

Dieses Feature erleichtert das Abrufen der Anweisungsvollständigung für bekannte Elemente.

JavaScript-Editor

Der JavaScript-Editor in Visual Studio 2012 Release Candidate ist völlig neu und verbessert die Arbeit mit JavaScript in Visual Studio erheblich.

Code outlining

Die Gliederung von Bereichen wird jetzt automatisch für alle Funktionen erstellt, sodass Sie Teile der Datei reduzieren können, die nicht für den aktuellen Fokus relevant sind.

Klammernabgleich (zugehörige Klammer)

Wenn Sie die Einfügemarke auf eine öffnende oder schließende geschweifte Klammer setzen, markiert der Editor die entsprechende.

Gehe zu Definition

Mit dem Befehl "Gehe zu Definition" können Sie zur Quelle für eine Funktion oder Variable springen.

ECMAScript5-Unterstützung

Der Editor unterstützt die neue Syntax und APIs in ECMAScript5, die neueste Version des Standards, die die JavaScript-Sprache beschreibt.

DOM IntelliSense

IntelliSense für DOM-APIs wurde verbessert, mit Unterstützung für viele neue HTML5-APIs, einschließlich querySelector, DOM Storage, cross-document messaging und canvas. DOM IntelliSense wird jetzt von einer einzelnen einfachen JavaScript-Datei und nicht von einer systemeigenen Typbibliotheksdefinition gesteuert. Dies erleichtert das Erweitern oder Ersetzen.

VSDOC-Signaturüberladungen

Detaillierte IntelliSense-Kommentare können jetzt für separate Überladungen von JavaScript-Funktionen mithilfe des neuen <Signaturelements> deklariert werden, wie in diesem Beispiel gezeigt:

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

Implizite Verweise

Sie können jetzt JavaScript-Dateien zu einer zentralen Liste hinzufügen, die implizit in die Liste der Dateien einbezogen wird, die von allen javaScript-Datei- oder Blockverweisen enthalten sind, was bedeutet, dass Sie IntelliSense für den Inhalt erhalten. Sie können z. B. jQuery-Dateien zur zentralen Liste der Dateien hinzufügen, und Sie erhalten IntelliSense für jQuery-Funktionen in einem beliebigen JavaScript-Dateiblock, unabhängig davon, ob Sie explizit darauf verwiesen haben (mit /// <reference />) oder nicht.

CSS-Editor

Abschluss der Anweisung automatisch reduzieren

Die IntelliSense-Liste für CSS filtert jetzt basierend auf den CSS-Eigenschaften und Werten, die vom ausgewählten Schema unterstützt werden.

Screenshot, der den Rahmenradius zeigt, der in einer IntelliSense-Liste für C S S ausgewählt ist, wenn Radiu eingegeben wird.

IntelliSense unterstützt auch Titelfallsuchen:

Screenshot zeigt die Schriftartstärke, die nach f w ausgewählt ist.

Hierarchischer Einzug

Der CSS-Editor verwendet Einenzug zum Anzeigen hierarchischer Regeln, wodurch Sie einen Überblick darüber erhalten, wie die Kaskadierungsregeln logisch organisiert werden. Im folgenden Beispiel ist die #list eine Selektor ein überlappendes untergeordnetes Element der Liste und wird daher eingezogen.

Screenshot, der ein Beispiel für den Einzug der Liste zeigt.

Das folgende Beispiel zeigt komplexere Vererbung:

Screenshot einer zusätzlichen Liste von Variablen.

Der Einzug einer Regel wird durch die übergeordneten Regeln bestimmt. Der hierarchische Einzug ist standardmäßig aktiviert, Sie können ihn jedoch im Dialogfeld "Optionen" deaktivieren (Extras, Optionen aus der Menüleiste):

Screenshot des Dialogfelds

Unterstützung für CSS-Hacks

Die Analyse von Hunderten realer CSS-Dateien zeigt, dass CSS-Hacks sehr häufig sind, und jetzt unterstützt Visual Studio die am häufigsten verwendeten. Diese Unterstützung umfasst IntelliSense und die Validierung von Star (*) und Unterstrich (_) Property Hacks:

Screenshot, der die in der Liste ausgewählte Höhe anzeigt.

Typische Selektor-Hacks werden ebenfalls unterstützt, sodass der hierarchische Einzug auch dann beibehalten wird, wenn sie angewendet werden. Ein typischer Selektor-Hack, der für Internet Explorer 7 verwendet wird, besteht darin, eine Auswahl mit *:first-child + html vorzuleiten. Die Verwendung dieser Regel behält den hierarchischen Einzug bei:

Screenshot, der ein Beispiel für einen typischen Selektorhack zeigt.

Anbieterspezifische Schemas (-moz-, -webkit)

CSS3 führt viele Eigenschaften ein, die von verschiedenen Browsern zu unterschiedlichen Zeiten implementiert wurden. Dies hat Entwickler zuvor gezwungen, mithilfe von herstellerspezifischer Syntax Code für bestimmte Browser zu codieren. Diese browserspezifischen Eigenschaften sind jetzt in IntelliSense enthalten.

Screenshot, der den in IntelliSense ausgewählten Wortumbruch von m s zeigt.

Kommentar- und Kommentarunterstützung aufheben

Sie können nun CSS-Regeln mit den gleichen Tastenkombinationen kommentieren und aufheben, die Sie im Code-Editor verwenden (STRG+K,C zum Kommentieren und STRG+K, Sie können die Kommentare aufheben).

Farbauswahl

In früheren Versionen von Visual Studio bestand IntelliSense für farbbezogene Attribute aus einer Dropdownliste mit benannten Farbwerten. Diese Liste wurde durch eine voll funktionsfähige Farbauswahl ersetzt.

Wenn Sie einen Farbwert eingeben, wird die Farbauswahl automatisch angezeigt und zeigt eine Liste der zuvor verwendeten Farben gefolgt von einer Standardfarbpalette an. Sie können eine Farbe mit der Maus oder der Tastatur auswählen.

Screenshot einer Liste der zuvor verwendeten Farben gefolgt von einer Standardfarbpalette.

Die Liste kann in eine vollständige Farbauswahl erweitert werden. Mit der Auswahl können Sie den Alphakanal steuern, indem Sie beim Verschieben des Deckkraftschiebereglers automatisch jede Farbe in RGBA konvertieren:

Screenshot einer Farbauswahl, indem beim Verschieben des Deckkraftschiebereglers automatisch eine Farbe in R G B A konvertiert wird.

Codeausschnitte

Codeausschnitte im CSS-Editor vereinfachen und beschleunigen das Erstellen browserübergreifender Formatvorlagen. Viele CSS3-Eigenschaften, die browserspezifische Einstellungen erfordern, wurden jetzt in Codeausschnitte eingeführt.

Screenshot mit Codeausschnitten im C S S-Editor. Die Wörter werden deaktiviert.

CSS-Codeausschnitte unterstützen erweiterte Szenarien (z. B. CSS3-Medienabfragen), indem sie das At-Symbol (@) eingeben, das die IntelliSense-Liste anzeigt.

Screenshot der in der IntelliSense-Liste ausgewählten Medien.

Wenn Sie einen Wert auswählen @media und die TAB-TASTE drücken, fügt der CSS-Editor den folgenden Codeausschnitt ein:

Screenshot eines Codeausschnitts mit ausgewählter 1024 p x-Auswahl.

Wie bei Codeausschnitten können Sie eigene CSS-Codeausschnitte erstellen.

Benutzerdefinierte Regionen

Benannte Codebereiche, die bereits im Code-Editor verfügbar sind, sind jetzt für die CSS-Bearbeitung verfügbar. Auf diese Weise können Sie verwandte Formatvorlagenblöcke auf einfache Weise gruppieren.

Screenshot des Code-Editors. Die verwendeten Formatvorlagenblöcke sind für das Menü

Wenn ein Bereich reduziert ist, wird der Name des Bereichs angezeigt:

Screenshot, der den reduzierten Menübereich zeigt.

Seitenprüfung

Seitenprüfung ist ein Tool, mit dem eine Webseite (HTML, Web Forms, ASP.NET MVC oder Webseiten) in der Visual Studio-IDE gerendert wird und Sie sowohl den Quellcode als auch die resultierende Ausgabe untersuchen können. Für ASP.NET Seiten können Sie Seitenprüfung bestimmen, welcher serverseitige Code das HTML-Markup erstellt hat, das im Browser gerendert wird.

Screenshot, der Visual Studio-Code zeigt. Der rechte Bereich enthält den Quellcode, und im linken Bereich wird die Webseite gerendert.

Weitere Informationen zu Seitenprüfung finden Sie in den folgenden Lernprogrammen:

Veröffentlichung

Veröffentlichungsprofile

In Visual Studio 2010 werden Veröffentlichungsinformationen für Webanwendungsprojekte nicht in der Versionssteuerung gespeichert und nicht für die Freigabe mit anderen entwickelt. In Visual Studio 2012 Release Candidate wurde das Format des Veröffentlichungsprofils geändert. Es wurde zu einem Teamartefakt gemacht, und es ist jetzt einfach, aus Builds, die auf MSBuild basieren, zu nutzen. Buildkonfigurationsinformationen werden im Dialogfeld "Veröffentlichen" angezeigt, sodass Sie vor der Veröffentlichung problemlos Buildkonfigurationen wechseln können.

Veröffentlichungsprofile werden im Ordner PublishProfiles gespeichert. Der Speicherort des Ordners hängt davon ab, welche Programmiersprache Sie verwenden:

  • C#: Properties\PublishProfiles
  • Visual Basic: Mein Projekt\PublishProfiles

Jedes Profil ist eine MSBuild-Datei. Während der Veröffentlichung wird diese Datei in die MSBuild-Datei des Projekts importiert. Wenn Sie in Visual Studio 2010 Änderungen am Veröffentlichungs- oder Paketprozess vornehmen möchten, müssen Sie Ihre Anpassungen in eine Datei namens "ProjectName.wpp.targets" einfügen. Dies wird weiterhin unterstützt, Aber Sie können jetzt Ihre Anpassungen im Veröffentlichungsprofil selbst platzieren. Auf diese Weise werden die Anpassungen nur für dieses Profil verwendet.

Sie können jetzt auch Veröffentlichungsprofile von MSBuild nutzen. Verwenden Sie dazu beim Erstellen des Projekts den folgenden Befehl:

msbuild.exe project.csproj /t:WebPublish /p:PublishProfile=ProfileName

Der Wert "project.csproj" ist der Pfad des Projekts, und "ProfileName" ist der Name des zu veröffentlichenden Profils. Alternativ können Sie anstelle des Profilnamens für die PublishProfile-Eigenschaft den vollständigen Pfad zum Veröffentlichungsprofil übergeben.

ASP.NET Vorkompilierung und Zusammenführung

Für Webanwendungsprojekte fügt Visual Studio 2012 Release Candidate eine Option auf der Seite "Package/Publish Web properties" hinzu, mit der Sie den Inhalt Ihrer Website beim Veröffentlichen oder Verpacken des Projekts vorab kompilieren und zusammenführen können. Um diese Optionen anzuzeigen, klicken Sie mit der rechten Maustaste auf das Projekt in Projektmappen-Explorer, wählen Sie "Eigenschaften" und dann die Eigenschaftenseite "Paket/Veröffentlichen" aus. Die folgende Abbildung zeigt die Vorkompilierung dieser Anwendung vor der Veröffentlichungsoption.

Screenshot zeigt, dass die Optionen der Eigenschaftenseite

Wenn diese Option ausgewählt ist, kompiliert Visual Studio die Anwendung immer dann, wenn Sie die Webanwendung veröffentlichen oder verpacken. Wenn Sie steuern möchten, wie die Website vorkompiliert ist oder wie Assemblys zusammengeführt werden, klicken Sie auf die Schaltfläche "Erweitert", um diese Optionen zu konfigurieren.

IIS Express

Der Standardwebserver zum Testen von Webprojekten in Visual Studio ist jetzt IIS Express. Visual Studio Development Server ist weiterhin eine Option für lokalen Webserver während der Entwicklung, iis Express ist jedoch jetzt der empfohlene Server. Die Verwendung von IIS Express in Visual Studio 11 Beta ähnelt der Verwendung in Visual Studio 2010 SP1 sehr.

Haftungsausschluss

Dies ist ein vorläufiges Dokument, das vor der kommerziellen Veröffentlichung der beschriebenen Software ggf. erheblich geändert wird.

Die in diesem Dokument enthaltenen Informationen stellen die Sicht der Microsoft Corporation der hier diskutierten Themen zum Zeitpunkt der Veröffentlichung dar. Da Microsoft auf wechselnde Marktbedingungen reagieren muss, sollten sie nicht als Verpflichtung seitens Microsoft interpretiert werden, und Microsoft kann die Genauigkeit der dargelegten Informationen nach dem Zeitpunkt der Veröffentlichung nicht garantieren.

Dieses Whitepaper dient ausschließlich Informationszwecken. MICROSOFT ÜBERNIMMT KEINE AUSDRÜCKLICHE, STILLSCHWEIGENDE ODER AUS GESETZ ERWACHSENDE GARANTIE IN BEZUG AUF DIE INFORMATIONEN IN DIESEM DOKUMENT.

Die Benutzer/innen sind verpflichtet, sich an alle anwendbaren Urheberrechtsgesetze zu halten. Unabhängig von der Anwendbarkeit der entsprechenden Urheberrechtsgesetze darf kein Teil dieses Dokuments ohne ausdrückliche schriftliche Erlaubnis der Microsoft Corporation für irgendwelche Zwecke vervielfältigt oder in einem Datenempfangssystem gespeichert oder darin eingelesen werden, unabhängig davon, auf welche Art und Weise oder mit welchen Mitteln (elektronisch, mechanisch, durch Fotokopieren, Aufzeichnen usw.) dies geschieht.

Es ist möglich, dass Microsoft Rechte an Patenten bzw. an angemeldeten Patenten, an Marken, Urheberrechten oder sonstigem geistigen Eigentum besitzt, die sich auf den fachlichen Inhalt dieses Dokuments beziehen. Die Bereitstellung dieses Dokuments gewährt Ihnen jedoch keinerlei Lizenzrechte an diesen Patenten, Marken, Urheberrechten oder anderem geistigen Eigentum, es sei denn, dies wurde ausdrücklich durch einen schriftlichen Lizenzvertrag mit der Microsoft Corporation vereinbart.

Sofern nicht anders angegeben, sind die Hierin dargestellten Beispielunternehmen, Organisationen, Produkte, Domänennamen, E-Mail-Adressen, Logos, Personen, Orte und Ereignisse fikttiv, und keine Zuordnung zu einem echten Unternehmen, Unternehmen, Produkt, Domänennamen, E-Mail-Adresse, Logo, Person, Ort oder Ereignis ist vorgesehen oder sollte abgeleitet werden.

© 2012 Microsoft Corporation. Alle Rechte vorbehalten.

Microsoft und Windows sind eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern.

Die in diesem Dokument erwähnten Namen von Unternehmen und Produkten können Marken der jeweiligen Eigentümer sein.