{"id":6174,"date":"2019-07-13T10:40:59","date_gmt":"2019-07-13T08:40:59","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6174"},"modified":"2019-07-13T10:49:27","modified_gmt":"2019-07-13T08:49:27","slug":"asp-net-core-razor-ansichten-vorkompilieren-verbessert-performance-und-fehlearnfaelligkeit","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/asp-net-core-razor-ansichten-vorkompilieren-verbessert-performance-und-fehlearnfaelligkeit\/","title":{"rendered":"ASP.NET Core Razor-Ansichten vorkompilieren verbessert Performance und Fehlearnf\u00e4lligkeit"},"content":{"rendered":"<p>Razor-Ansichten wurden in ASP.NET bisher zur Laufzeit geladen. Das vorkompilieren (oft auch aus PreCompilieren bezeichnet) \u00e4ndert dies: Die .cshtml Dateien werden zu einer DLL kompiliert. Damit lassen sich diese zur Laufzeit nicht mehr ver\u00e4ndern. Im Regelfall ist dies zumindest produktiv auch nicht erforderlich. <\/p>\n<h2 class=\"wp-block-heading\">Warum ist PreCompilieren sinnvoll?<\/h2>\n<p>Dieses Vorgehen hat zwei gro\u00dfe Vorteile: Zum einen werden Fehler in den Razor-Ansichten bereits w\u00e4hrend des Kompilierens sichtbar. Besonders macht sich dies beispielsweise bei eingebundenen Teilansichten bemerkbar. Diese wurden bisher erst zur Laufzeit eingebunden. Im schlechtesten Falle tritt so ein Fehler erst dann auf, wenn ein Nutzer eine bestimmte Aktion ausf\u00fchrt. <\/p>\n<p>Au\u00dferdem steigt die Performance: Das Kompilieren wurde bisher bei jedem Aufruf durchgef\u00fchrt. Dies kostet Zeit und Rechenleistung. Mittels Vorkompilieren verlagert sich dies in den Buildprozess. Nun muss lediglich einmal Vorkompiliert werden, statt pro Request. Gerade bei vielen, komplexeren Views bzw. stark frequentierten Anwendungen sind die Auswirkungen deutlich sp\u00fcrbar. <\/p>\n<h2 class=\"wp-block-heading\">Wie kann Vorkompilieren in ASP.NET Core aktiviert werden?<\/h2>\n<h3 class=\"wp-block-heading\">ASP.NET Core 1.x<\/h3>\n<p>Dies h\u00e4ngt davon ab, welche Version eingesetzt wird. Bei der alten 1.1 LTS-Version war dies noch nicht aktiviert. Hier muss zun\u00e4chst die .csproj Datei des Projektes angepasst werden: <\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;PropertyGroup&gt;\n  &lt;TargetFramework&gt;netcoreapp1.1&lt;\/TargetFramework&gt;\n \n  &lt;MvcRazorCompileOnPublish&gt;true&lt;\/MvcRazorCompileOnPublish&gt;\n  &lt;PreserveCompilationContext&gt;true&lt;\/PreserveCompilationContext&gt;\n&lt;\/PropertyGroup&gt;\n<\/pre>\n<\/div>\n<p>Nun m\u00fcssen wir zwei NuGet-Pakete einbinden: <\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;ItemGroup&gt;\n    &lt;PackageReference Include=&quot;Microsoft.AspNetCore.Mvc.Razor.ViewCompilation&quot; Version=&quot;1.1.1&quot; \/&gt;\n    &lt;PackageReference Include=&quot;Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools&quot; Version=&quot;1.1.0-preview4-final&quot; \/&gt;\n&lt;\/ItemGroup&gt;\n<\/pre>\n<\/div>\n<p>Die Versionen sind entsprechend der eingesetzten .NET Core Version anzupassen. Zu guter Letzt ist es notwendig, den Views-Ordner in den Deployment-Prozess mit einzubinden:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;ItemGroup&gt;\n  &lt;!-- Wird fuer das PreCompilieren von Views benoetigt --&gt;\n  &lt;Folder Include=&quot;Views&quot; \/&gt;\n&lt;\/ItemGroup&gt;\n<\/pre>\n<\/div>\n<p>Wird nun neu kompiliert, sollte man im <strong>bin\/Debug\/netcoreapp1.1 <\/strong>Ordner eine DLL namens <strong>${Projektname}.Views.dll<\/strong> finden. Darin befinden sich die vorkompilierten Views. <\/p>\n<h3 class=\"wp-block-heading\">ASP.NET Core 2.x und 3.x<\/h3>\n<p>Auch in der .NET Foundation wurde festgestellt, dass Vorkompilieren sinnvoll ist. Daher ist es seit Version 2 nicht nur standardm\u00e4\u00dfig aktiviert, sondern sogar in das Razor-SDK deaktiviert. Das dadurch veraltete Pre-Compilierungstool von .NET Core 1.x sollte daher nicht eingesetzt werden. <\/p>\n<p>Wenn die oben beschriebenen Eigenschaften in einem 2.x Projekt gesetzt sind. findet jedoch ein Fallback auf das alte Tool statt. Daher empfiehlt es sich, die Konfiguration bei 2.x Projekten vollst\u00e4ndig zu entfernen und das SDK im &lt;Project&gt; Tag zu setzen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;Project SDK=&quot;Microsoft.NET.Sdk.Razor&quot;&gt;\n  &lt;!-- Projektkonfiguration --&gt;\n&lt;\/Project&gt;\n<\/pre>\n<\/div>\n<p>In 3.x wurde das alte Tool ohnehin entfernt, <a href=\"https:\/\/docs.microsoft.com\/de-de\/aspnet\/core\/mvc\/views\/view-compilation?view=aspnetcore-2.2\" target=\"_blank\" rel=\"nofollow\">wie man in der ASP.NET Core Dokumentation nachlesen kann<\/a>.  <\/p>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>Das Vorkompilieren macht sowohl hinsichtlich Leistung als auch einer geringeren Fehleranf\u00e4lligkeit Sinn. War die explizite Aktivierung bei .NET Core 1.x noch notwendig, geh\u00f6rt es mittlerweile zum Standard Razor-SDK. Da das Supportende von 1.1 naht, sind zuk\u00fcnftig keine manuellen \u00c4nderungen mehr notwendig, um die Vorteile nutzen zu k\u00f6nnen. <a href=\"https:\/\/u-labs.de\/portal\/asp-net-mvc-razor-ansichten-vorkompilieren-fuer-mehr-performance-und-flexibilitaet\/\">Beim alten ASP.NET MVC 4.x Stack bleibt dies weiterhin der Fall<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Razor-Ansichten wurden in ASP.NET bisher zur Laufzeit geladen. Das vorkompilieren (oft auch aus PreCompilieren bezeichnet) \u00e4ndert dies: Die .cshtml Dateien werden zu einer DLL kompiliert. Damit lassen sich diese zur Laufzeit nicht mehr ver\u00e4ndern. Im Regelfall ist dies zumindest produktiv auch nicht erforderlich. Warum ist PreCompilieren sinnvoll? Dieses Vorgehen hat zwei gro\u00dfe Vorteile: Zum einen &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6178,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,78],"tags":[522,70],"class_list":["post-6174","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","category-software","tag-asp-net-core","tag-performance"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6174","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6174"}],"version-history":[{"count":5,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6174\/revisions"}],"predecessor-version":[{"id":6207,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6174\/revisions\/6207"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6178"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6174"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6174"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6174"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}