Was bedeuten die TargetFramework-Einstellungen in web.config in ASP .NET MVC?

79

Eine unserer ASP.NET MVC 5-Webanwendungen verfügt über die folgenden Einstellungen für web.config:

<system.web>
  <compilation debug="true" targetFramework="4.6" />
  <httpRuntime targetFramework="4.5" />
  <!--... many other things -->
</system.web>

Es ist nicht klar, warum zwei targetFramework-Einstellungen vorhanden sind, und es scheint falsch zu sein, Targeting 4.6 zu kompilieren und dann zu versuchen, unter 4.5 zu laufen ...

Natürlich fehlt mir etwas, aber was?

p.pickardou
quelle
5
In Verbindung stehender Blog-Beitrag blogs.msdn.microsoft.com/webdev/2012/11/19/…
nu everest

Antworten:

57

Der Grund für die targetFrameworkExistenz in web.configbesteht darin, Kompatibilitätsprobleme zwischen Änderungen für jede Version von .NET Framework zu vermeiden. Der Unterschied zwischen targetFrameworkon compilationund httpRuntimegehört zu jeder Entwicklungs- und Bereitstellungsumgebung.

Laut MSDN-Blog :

<compilation targetFramework="4.6" />

Wählt aus, welche Version der .NET Framework-Referenzassemblys beim Kompilieren verwendet wird. (Hinweis: Für Visual Studio muss dieses Element in Web.config vorhanden sein, obwohl wir es automatisch ableiten.)

Dieses Element bestimmt die Assemblyversion, die während der Kompilierung zum Erstellen von Abhängigkeiten und zugehörigen Assemblys aus dem aktuellen Projekt verwendet wird.

<httpRuntime targetFramework="4.5" /> bedeutet, dass das aktuelle Projekt zur Verwendung von .NET 4.5-Laufzeitassemblys konzipiert ist, ohne vorhandene Projektassemblys auf dem Bereitstellungscomputer neu zu kompilieren, bevor es in den Speicher geladen wird.

Daher können wir daraus schließen, dass die targetFrameworkin httpRuntimeelement definierte Versionsnummer die Kompatibilität zwischen kompiliertem Projekt und verfügbaren Assemblys bei der Laufzeitnutzung gewährleistet, abhängig davon, welche Version von Laufzeitdateien auf dem Zielcomputer verwendet wird.

In Ihrem Fall ist dies also kein falsches Verhalten. Die Projektersteller möchten lediglich die Laufzeitkompatibilität mit der niedrigsten auf dem Zielcomputer verfügbaren Laufzeitversion mit ähnlichen Merkmalen (dh Version 4.5) beibehalten, selbst wenn das Projekt mit einer neueren Version von kompiliert wurde .NET-Assemblys. Der Unterschied zwischen Version 4.5 und 4.6 ist relativ gering, sodass die Laufzeitversion auf 4.5 in diesem Kontext immer noch akzeptabel bleibt.

Verwandte Referenzen:

https://msdn.microsoft.com/en-us/library/dn833123(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/dn833125(v=vs.110).aspx

Tetsuya Yamamoto
quelle
9
Vielleicht bin ich es, ich verstehe immer noch nicht, wie etwas "... entworfen, um .NET 4.5 zu verwenden ...", wenn wir 4.6 verwendet haben, wenn ausgewählt "... eine Version der Referenz-Assemblys von .NET Framework beim Kompilieren verwendet wird ... "
g.pickardou
2
.NET 4.6 ist ein Teilmengen-Update von .NET 4.5 und basiert daher auch auf .NET 4.5-Assemblyreferenzen mit einigen geringfügigen Unterschieden (beachten Sie, dass .NET seit Version 2.0 Abwärtskompatibilitätsunterstützung bietet). Tatsächlich wird das Projekt unter Verwendung von Assemblyreferenzen der Version 4.6 kompiliert, kann jedoch Laufzeitreferenzen der Version 4.5 auf dem Zielcomputer verwenden, wenn keine höheren Versionen verfügbar sind.
Tetsuya Yamamoto
4
Sie beziehen sich auf "Abwärtskompatibilität". Per Definition bedeutet dies jedoch: Eine Sache, die eine niedrigere Version erwartet, funktioniert im Kontext einer höheren Version nahtlos. (weil die höhere Version abwärtskompatibel ist "Nicht umgekehrt.
g.pickardou
4
Ich habe einen guten Artikel gefunden, der bei msdn wenig mehr darüber erklären kann. blogs.msdn.microsoft.com/webdev/2012/11/19/…
dev
2
Diese Antwort sieht so falsch aus und der Antwortende hat sie von hinten nach vorne gebracht. Wenn ich also Funktionen in 4.6 verwende und damit kompiliere, sollte die App bei der Bereitstellung auf dem Zielserver (4.5) fehlschlagen, da diese Funktionen in älteren Versionen nicht vorhanden sind.
Joedotnot
9

Nach meinem Verständnis <compilation debug="true" targetFramework="4.6" />wird unterdrückt, <httpRuntime targetFramework="4.5" />da seitdem httpRuntimein folgendes übersetzt wird

<compilation targetFramework="4.5" />
<machineKey compatibilityMode="Framework45" />
<pages controlRenderingCompatibilityVersion="4.5" />

Die obige Einstellung ist wahrscheinlich auf ein Missverständnis oder einen Fehler zurückzuführen, wenn sie direkt von VS durchgeführt wird, was ich nicht für wahr halte.

Um zu verstehen, wie diese Einstellung und alle anderen verwandten Dinge dazu führen, dass Ihnen ein Blog mit dem Titel Alles über <httpRuntime targetFramework>, das von einem Microsoft-Mitarbeiter geschrieben wurde, hilft. Aber das Wesentliche ist;

Das .NET Framework (einschließlich ASP.NET) ist bestrebt, eine nahezu 100% ige Kompatibilität aufrechtzuerhalten, wenn ein vorhandenes Framework auf einem Computer aktualisiert wird. Wir versuchen so weit wie möglich sicherzustellen, dass eine Anwendung, die für .NET Framework 4 entwickelt und bereitgestellt wurde, unter 4.5 einfach weiter funktioniert. Dies bedeutet normalerweise, dass zwischen den Versionen skurrile, fehlerhafte oder unerwünschte Verhaltensweisen im Produkt beibehalten werden, da sich das Beheben dieser Verhaltensweisen negativ auf Anwendungen auswirken kann, die sich auf diese Verhaltensweisen stützen.

Mubashar
quelle
4
Im Blog-Beitrag wird vorgeschlagen, dass alle Einstellungen, die explizit in der web.config festgelegt werden, nicht durch die Einstellungen der httpRuntime-Einstellung überschrieben werden: "Auch wenn <httpRuntime targetFramework =" 4.5 "/> normalerweise <pages controlRenderingCompatibilityVersion = implizieren würde "4.5" />, die Laufzeit merkt, dass Sie controlRenderingCompatibilityVersion bereits explizit festgelegt haben, und respektiert Ihre Einstellung. "
Code4pi
2
Nur zur Information: Wenn die Kompilierung festgelegt ist, während httpRuntime nicht festgelegt ist, haben die Einstellungen für Maschinenschlüssel und Seiten nicht 4,5 als Standardwert. Sie müssen manuell festgelegt werden. Dies ist sehr wichtig, wenn Sie versuchen, Cookies zwischen älteren Websites und der .net-Kernwebsite zu teilen.
Jarvan
Was ist die Interpretation, wenn das targetFramework sowohl für Compilation als auch für HttpRuntime fehlt?
Anirudh Goel
Bitte bestätigen Sie mit Google, aber ich denke, diese Attribute werden verwendet, um den Anwendungsbereich und das Framework auf eine bestimmte Version zu beschränken. Wenn dies jedoch nicht angegeben wird, wird wahrscheinlich davon ausgegangen, dass es keine Einschränkung gibt, und es wird versucht, die zuletzt installierte Version auszuführen. Dies ist möglicherweise keine gute Idee, obwohl davon ausgegangen wird, dass einige Apps in der alten Version ausgeführt werden, z. B. 4.0, während Sie eine andere App installieren, die möglicherweise die neuesten Framework-Funktionen verwendet, z. B. 4.7.2.
Mubashar