{"id":4550,"date":"2016-09-18T09:57:14","date_gmt":"2016-09-18T08:57:14","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=4550"},"modified":"2016-09-03T09:57:40","modified_gmt":"2016-09-03T08:57:40","slug":"asp-net-core-verschiedene-umgebungen-wie-entwicklungproduktiv-nutzen","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/asp-net-core-verschiedene-umgebungen-wie-entwicklungproduktiv-nutzen\/","title":{"rendered":"ASP.NET Core: Verschiedene Umgebungen wie Entwicklung\/Produktiv nutzen"},"content":{"rendered":"<p>Das Verhalten einer Anwendung je nach Umgebung anpassen zu k\u00f6nnen, kann eine gro\u00dfe Hilfe f\u00fcr Entwickler sein: So lassen sich Debug-Informationen wie detaillierte Fehlerseiten w\u00e4hrend der Entwicklung anzeigen, die auf dem Produktivsystem kein Nutzer sehen wird. Durch das Definieren von Umgebungen die dar\u00fcber entscheiden wird sichergestellt, dass die manuelle Entfernung solcher Entwicklungstools nicht vergessen wird. Im alten ASP.NET Framework gab es keine eingebaute L\u00f6sung hierf\u00fcr. Doch auch hier hat ASP.NET Core einen gro\u00dfen Schritt nach Vorne gemacht: Der Nutzer kann mit wenig Aufwand eigene Umgebungen erstellen und seinen Code entsprechend anpassen. Folgender Artikel zeigt, wie es geht.<\/p>\n<h4><strong>Definieren und setzen einer Umgebung<\/strong><\/h4>\n<p>Die aktuell genutzte Umgebung wird \u00fcber die Umgebungsvariable\u00a0<strong>ASPNETCORE_ENVIRONMENT<\/strong> definiert. Sie enth\u00e4lt den Namen der Umgebung als String.\u00a0Standardm\u00e4\u00dfig sieht ASP.NET dabei Development, Staging und Production vor. Man kann aber problemlos eigene Definieren. W\u00e4hrend des Debuggens in Visual Studio kann die Umgebung \u00fcber die Projekteigenschaften (Rechtsklick auf das Projekt) definiert werden:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/u-img.net\/img\/6339Qz.jpg\" \/><\/p>\n<p>Oder alternativ \u00fcber Properties &gt; launchSettings.json im Attribute\u00a0<em>profiles<\/em>, hier lassen sich die gleichen Einstellungen im JSON-Format \u00e4ndern.<\/p>\n<h4><strong>Umgebung aus C# heraus abfragen<\/strong><\/h4>\n<p>Da ASP.NET Core stark auf Dependency Injection statt statischer, geteilter Instanzen setzt, erhalten wir die Umgebung nur \u00fcber\u00a0IApplicationBuilder &#8211; Also in\u00a0<em>Configure<\/em> der Startup-Klasse. F\u00fcr die eingebauten Umgebungen existieren bereits Hilfsfunktionen wie <em>IsDevelopment()<\/em>. Selbst definierte lassen sich \u00fcber <em>IsEnvironment()<\/em> abfragen:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory){\r\n            bool isDevelopment = env.IsDevelopment();\r\n            bool isMyEnvironment = env.IsEnvironment(&quot;MyEnvironment&quot;);\r\n\r\n            if(isDevelopment) {\r\n                app.UseDeveloperExceptionPage();\r\n            }else {\r\n                app.UseExceptionHandler(&quot;\/Home\/Error&quot;);\r\n            }\r\n        }\r\n<\/pre>\n<p>Der Vorteil von <em>IsEnvironment()<\/em> gegen\u00fcber dem Attribute <em>EnvironmentName<\/em> liegt in der Unabh\u00e4ngigkeit der Schreibweise. <em>IsEnvironment()<\/em> ignoriert die Gro\u00df- und Kleinschreibung, wogegen <em>EnvironmentName<\/em> die definierte Umgebung in der Originalschreibweise enth\u00e4lt.\u00a0M\u00f6chte man die Umgebung au\u00dferhalb der Startup-Klasse abfragen, muss wie Anfangs schon erw\u00e4hnt Dependency Injection verwendet werden.<\/p>\n<h4><strong>Umgebung in Razor-Ansichten abfragen<\/strong><\/h4>\n<p>Einzige Ausnahme sind Ansichten (Views) in Razor. Hier existiert ein TagHelper namens\u00a0<em>environment<\/em><em>,\u00a0<\/em>mit dem sich HTML- oder Razor-Code nur in bestimmten Umgebungen einf\u00fcgen l\u00e4sst. Man hat die Wahl eine einzige Umgebung anzugeben, oder mehrere mit Komma zu trennen:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n   &lt;environment names=&quot;Development&quot;&gt;\r\n        &lt;link rel=&quot;stylesheet&quot; href=&quot;~\/lib\/bootstrap\/dist\/css\/bootstrap.css&quot; asp-append-version=&quot;true&quot; \/&gt;\r\n        &lt;link rel=&quot;stylesheet&quot; href=&quot;~\/css\/site.css&quot; asp-append-version=&quot;true&quot; \/&gt;\r\n    &lt;\/environment&gt;\r\n    &lt;environment names=&quot;Staging,Production&quot;&gt;\r\n        &lt;link rel=&quot;stylesheet&quot; href=&quot;~\/css\/full.min.css&quot; asp-append-version=&quot;true&quot; \/&gt;\r\n    &lt;\/environment&gt;\r\n<\/pre>\n<p>Dieses Beispiel f\u00fcgt die Stylesheets in der Entwicklungsumgebung einzeln und unver\u00e4ndert ein, um das Debuggen zu erleichtern. In der Staging- und Produktivumgebung dagegen wird die kombinierte und verkleinerte Version geladen, um die Ladezeit zu verbessern. Au\u00dferdem wird in beiden Umgebungen durch das aktivieren des <em>asp-append-version<\/em> Attributes der Hash in Form eines URL-Parameters angef\u00fcgt:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;link rel=&quot;stylesheet&quot; href=&quot;\/css\/full.min.css?v=1wp5zz4e-mOPFx4X2O8seW_DmUtePn5xFJk1vB7JKRc&quot; \/&gt;\r\n<\/pre>\n<p>Dies nennt sich <em>Cache busting<\/em>. Sie verhindert die Zwischenspeicherung des Stylesheets durch den Browser, wodurch \u00c4nderungen nicht oder erst versp\u00e4tet geladen und somit sichtbar werden. Bei den alten ASP.NET Bundles wurde er automatisch eingef\u00fcgt, wenn das Projekt nicht im Debug-Modus gestartet wird.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Verhalten einer Anwendung je nach Umgebung anpassen zu k\u00f6nnen, kann eine gro\u00dfe Hilfe f\u00fcr Entwickler sein: So lassen sich Debug-Informationen wie detaillierte Fehlerseiten w\u00e4hrend der Entwicklung anzeigen, die auf dem Produktivsystem kein Nutzer sehen wird. Durch das Definieren von Umgebungen die dar\u00fcber entscheiden wird sichergestellt, dass die manuelle Entfernung solcher Entwicklungstools nicht vergessen wird. &#8230;<\/p>\n","protected":false},"author":5,"featured_media":4567,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[522,537],"class_list":["post-4550","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-asp-net-core","tag-asp-net-core-1-0"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4550","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=4550"}],"version-history":[{"count":13,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4550\/revisions"}],"predecessor-version":[{"id":4566,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/4550\/revisions\/4566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/4567"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=4550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=4550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=4550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}