{"id":109895,"date":"2025-05-14T12:21:08","date_gmt":"2025-05-14T12:21:08","guid":{"rendered":"https:\/\/www.europesays.com\/de\/109895\/"},"modified":"2025-05-14T12:21:08","modified_gmt":"2025-05-14T12:21:08","slug":"net-10-0-preview-4-setzt-fokus-auf-webentwicklung","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/de\/109895\/","title":{"rendered":".NET 10.0 Preview 4 setzt Fokus auf Webentwicklung"},"content":{"rendered":"<p>.NET 10.0 Preview 4 steht seit gestern zum Download <a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\/dotnet\/10.0\" rel=\"external noopener\" target=\"_blank\">auf der .NET-Downloadseite bereit<\/a>. Die Neuerungen betreffen insbesondere die Webentwicklung mit neuen, auf ASP.NET Core basierenden Web-APIs und Verbesserungen beim Blazor-Framework.<\/p>\n<p>    <img loading=\"lazy\" decoding=\"async\" alt=\"\" height=\"293\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 233 \/ 293; object-fit: cover;\" width=\"233\"\/><\/p>\n<p class=\"a-inline-textbox__synopsis\">\n          Dr. Holger Schwichtenberg ist Chief Technology Expert bei der MAXIMAGO-Softwareentwicklung. Mit dem Expertenteam bei www.IT-Visions.de bietet er zudem Beratung und Schulungen im Umfeld von Microsoft-, Java- und Webtechniken an. Er h\u00e4lt Vortr\u00e4ge auf Fachkonferenzen und ist Autor zahlreicher Fachb\u00fccher.&#13;<\/p>\n<p>Parallel dazu ist Visual Studio 2022 Version 17.14 in einer stabilen Version erschienen. Anders als bisher gibt es f\u00fcr Visual Studio keine neue Preview-Version 17.5, sondern eine Version 17.14 Preview 7. Da n\u00e4chste Woche vom 19. bis 22. Mai die Build-Konferenz 2025 von Microsoft in Seattle <a href=\"https:\/\/build.microsoft.com\/en-US\/home\" rel=\"external noopener\" target=\"_blank\">und online<\/a> stattfindet, k\u00f6nnte Microsoft dort die Perview einer neuen Hauptversion pr\u00e4sentieren. Das letzte Major Release vor Visual Studio 2022 war Visual Studio 2019.<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/4\/8\/5\/3\/4\/9\/2\/image1-3a419109fa49d104.png\" target=\"_blank\" rel=\"noopener\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Visual Studio 2022\" height=\"1260\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 2240 \/ 1260; object-fit: cover;\" width=\"2240\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Parallel zu .NET 10.0 ist Visual Studio 2022 Version 17.14 als Preview 7 erschienen.<\/p>\n<p class=\"a-caption__source\">\n      (Bild:\u00a0Screenshot (Holger Schwichtenberg))\n    <\/p>\n<p>JSON Patch f\u00fcr System.Text.Json und ASP.NET Core-basierte Web-APIs<\/p>\n<p>ASP.NET Core 10.0 beherrscht nun den JSON-Patch-Standard nach RFC 6902 auch in Verbindung mit Microsofts JSON-Serialisierer System.Text.Json <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.JsonPatch.SystemTextJson\/10.0.0-preview.4.25258.110\" rel=\"external noopener\" target=\"_blank\">mithilfe des Zusatzpakets<\/a> Microsoft.AspNetCore.JsonPatch.SystemTextJson<\/p>\n<p>Bisher war JSON Patch nur in Verbindung mit der \u00e4lteren Bibliothek Newtonsoft.Json m\u00f6glich. Microsoft verspricht im Vergleich dazu <a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/10.0\/preview\/preview4\/aspnetcore.md#json-patch-with-systemtextjson\" rel=\"external noopener\" target=\"_blank\">in den Release Notes<\/a> eine verbesserte Leistung und weniger Speichernutzung in Verbindung mit einem \u00e4hnlichen Design wie bei Newtonsoft.Json, einschlie\u00dflich der Aktualisierung eingebetteter Objekte und Arrays. Bisher nicht verf\u00fcgbar ist JSON Patch f\u00fcr dynamische Objekte, weil Newtonsoft.Json daf\u00fcr Reflection einsetzt, System.Text.Json soll aber auch mit dem NativeAOT-Compiler funktionieren.<\/p>\n<p>Im NuGet-Paket Microsoft.AspNetCore.JsonPatch.SystemTextJson gibt es eine Klasse JsonPatchDocument mit einer Methode ApplyTo(obj), die eine JSON Patch-Operation auf das \u00fcbergebene Objekt anwendet, wie in folgendem Code aus den Release Notes:<\/p>\n<p>\/\/ Original object<br \/>\nvar person = new Person<br \/>\n{<br \/>\n    FirstName = &#8222;John&#8220;,<br \/>\n    LastName = &#8222;Doe&#8220;,<br \/>\n    Email = &#8222;johndoe@gmail.com&#8220;,<br \/>\n    PhoneNumbers = [new() { Number = &#8222;123-456-7890&#8220;, Type = PhoneNumberType.Mobile }],<br \/>\n    Address = new Address<br \/>\n    {<br \/>\n        Street = &#8222;123 Main St&#8220;,<br \/>\n        City = &#8222;Anytown&#8220;,<br \/>\n        State = &#8222;TX&#8220;<br \/>\n    }<br \/>\n};<\/p>\n<p>\/\/ Raw JSON patch document<br \/>\nstring jsonPatch = &#8222;&#8220;&#8220;<br \/>\n[<br \/>\n    { &#8222;op&#8220;: &#8222;replace&#8220;, &#8222;path&#8220;: &#8222;\/FirstName&#8220;, &#8222;value&#8220;: &#8222;Jane&#8220; },<br \/>\n    { &#8222;op&#8220;: &#8222;remove&#8220;, &#8222;path&#8220;: &#8222;\/Email&#8220;},<br \/>\n    { &#8222;op&#8220;: &#8222;add&#8220;, &#8222;path&#8220;: &#8222;\/Address\/ZipCode&#8220;, &#8222;value&#8220;: &#8222;90210&#8220; },<br \/>\n    { &#8222;op&#8220;: &#8222;add&#8220;, &#8222;path&#8220;: &#8222;\/PhoneNumbers\/-&#8222;, &#8222;value&#8220;: { &#8222;Number&#8220;: &#8222;987-654-3210&#8220;, &#8222;Type&#8220;: &#8222;Work&#8220; } }<br \/>\n]<br \/>\n&#8222;&#8220;&#8220;;<\/p>\n<p>\/\/ Deserialize the JSON patch document<br \/>\nvar patchDoc = JsonSerializer.Deserialize&gt;(jsonPatch);<\/p>\n<p>\/\/ Apply the JSON patch document<br \/>\npatchDoc!.ApplyTo(person);<\/p>\n<p>\/\/ Output updated object<br \/>\nConsole.WriteLine(JsonSerializer.Serialize(person, serializerOptions));<\/p>\n<p>Der Code erzeugt folgendes Ergebnis:<\/p>\n<p>Output:<br \/>\n{<br \/>\n  &#8222;firstName&#8220;: &#8222;Jane&#8220;,<br \/>\n  &#8222;lastName&#8220;: &#8222;Doe&#8220;,<br \/>\n  &#8222;address&#8220;: {<br \/>\n    &#8222;street&#8220;: &#8222;123 Main St&#8220;,<br \/>\n    &#8222;city&#8220;: &#8222;Anytown&#8220;,<br \/>\n    &#8222;state&#8220;: &#8222;TX&#8220;,<br \/>\n    &#8222;zipCode&#8220;: &#8222;90210&#8220;<br \/>\n  },<br \/>\n  &#8222;phoneNumbers&#8220;: [<br \/>\n    {<br \/>\n      &#8222;number&#8220;: &#8222;123-456-7890&#8220;,<br \/>\n      &#8222;type&#8220;: &#8222;Mobile&#8220;<br \/>\n    },<br \/>\n    {<br \/>\n      &#8222;number&#8220;: &#8222;987-654-3210&#8220;,<br \/>\n      &#8222;type&#8220;: &#8222;Work&#8220;<br \/>\n    }<br \/>\n  ]<br \/>\n}<\/p>\n<p>Abrundung f\u00fcr vorherige Neuerungen<\/p>\n<p>Seit ASP.NET Core 10.0 Preview 3 gibt es Validierung von Parametern auch in Minimal Web-APIs. In Preview 4 funktioniert das auch, wenn die Parameter ein Record-Typ sind.<\/p>\n<p>Die ebenfalls zuvor eingef\u00fchrte Ber\u00fccksichtigung der XML-Dokumentation bei der OpenAPI-Dokumenten kann nun auf XML-Kommentare aus anderen Assemblies ausgedehnt werden. In den Release Notes zeigt Microsoft ein Codebeispiel, das die XML-Kommentare aus der SDK-Assembly Microsoft.AspNetCore.Http einbindet:<\/p>\n<p>    &#8218;%(RootDir)%(Directory)%(Filename).xml&#8216;)&#8220;<br \/>\n      Condition=&#8220;&#8218;%(ReferencePath.Filename)&#8216; == &#8218;Microsoft.AspNetCore.Http.Abstractions'&#8220;<br \/>\n      KeepMetadata=&#8220;Identity;HintPath&#8220; \/&gt;<\/p>\n<p>Diagnosedaten f\u00fcr Blazor WebAssembly<\/p>\n<p>Eine gr\u00f6\u00dfere neue Funktion bekommt die WebAssembly-basierte Variante von Blazor, die als Single-Page-App im Webbrowser l\u00e4uft: Entwicklerinnen und Entwickler k\u00f6nnen dort zur Laufzeit Diagnosedaten zu Performance, Speicherinhalt und diverse Metriken sammeln. Dazu m\u00fcssen sie die .NET WebAssembly Build Tools in der aktuellen Version installieren (dotnet workload install wasm-tools) und in der Projektdatei die Eintr\u00e4ge folgender <a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/10.0\/preview\/preview4\/aspnetcore.md#blazor-webassembly-runtime-diagnostics\" rel=\"external noopener\" target=\"_blank\">Tabelle aus den Release Notes<\/a>:<\/p>\n<tr>\n<td class=\"heise-table-title\" style=\"text-align:left;\">\n                 Property\n              <\/td>\n<td class=\"heise-table-title\" style=\"text-align:left;\">\n                 Default\n              <\/td>\n<td class=\"heise-table-title\" style=\"text-align:left;\">\n                 Set value to\u2026\n              <\/td>\n<td class=\"heise-table-title\" style=\"text-align:left;\">\n                 Description\n              <\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\">\n<\/td>\n<td style=\"text-align:left;\">\n                 false\n              <\/td>\n<td style=\"text-align:left;\">\n                 true\n              <\/td>\n<td style=\"text-align:left;\">\n                 Enables support for WebAssembly performance tracing.\n              <\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\">\n<\/td>\n<td style=\"text-align:left;\">\n                 none\n              <\/td>\n<td style=\"text-align:left;\">\n                 all\n              <\/td>\n<td style=\"text-align:left;\">\n                 Enables instrumentation necessary for the sampling profiler.\n              <\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\">\n<\/td>\n<td style=\"text-align:left;\">\n                 false\n              <\/td>\n<td style=\"text-align:left;\">\n                 true\n              <\/td>\n<td style=\"text-align:left;\">\n                 Enables\u00a0EventPipe\u00a0support.\n              <\/td>\n<\/tr>\n<tr>\n<td style=\"text-align:left;\">\n<\/td>\n<td style=\"text-align:left;\">\n                 false\n              <\/td>\n<td style=\"text-align:left;\">\n                 true\n              <\/td>\n<td style=\"text-align:left;\">\n                 Enables\u00a0System.Diagnostics.Metrics\u00a0support.\n              <\/td>\n<\/tr>\n<p>Danach kann man per JavaScript-APIs auf die Diagnosedaten zugreifen:<\/p>\n<p>\/\/ Collect a performance profile using CPU sampling for a specified duration.<br \/>\nglobalThis.getDotnetRuntime(0).collectCpuSamples({durationSeconds: 60});<\/p>\n<p>\/\/ Collect metrics for a specified duration.<br \/>\nglobalThis.getDotnetRuntime(0).collectPerfCounters({durationSeconds: 5});<\/p>\n<p>\/\/ Collect a memory dump.<br \/>\nglobalThis.getDotnetRuntime(0).collectGcDump();<\/p>\n<p>Das Ergebnis ist eine .nettrace-Datei, die man in Visual Studio betrachten kann. Alternativ kann man auch die Performance-Werkzeuge des Webbrowsers verwenden.<\/p>\n<p>      <a href=\"https:\/\/www.heise.de\/imgs\/18\/4\/8\/5\/3\/4\/9\/2\/image2-42b161dd992bd8ce.png\" target=\"_blank\" rel=\"noopener\"><\/p>\n<p>  <img loading=\"lazy\" decoding=\"async\" alt=\"Leistungsdaten WebAssembly\" height=\"974\" src=\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='696px' height='391px' viewBox='0 0 696 391'%3E%3Crect x='0' y='0' width='696' height='391' fill='%23f2f2f2'%3E%3C\/rect%3E%3C\/svg%3E\" style=\"aspect-ratio: 1846 \/ 974; object-fit: cover;\" width=\"1846\"\/><\/p>\n<p>      <\/a><\/p>\n<p>Der Edge Browser zeigt die WebAssembly-Leistungsdaten.<\/p>\n<p class=\"a-caption__source\">\n      (Bild:\u00a0<a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/10.0\/preview\/preview4\/aspnetcore.md#blazor-webassembly-runtime-diagnostics\" rel=\"external noopener\" target=\"_blank\">Microsoft<\/a>)\n    <\/p>\n<p>Interoperabilit\u00e4t zwischen C# und JavaScript<\/p>\n<p>In Blazor erweitert Microsoft die Schnittstellen f\u00fcr die Interoperabilit\u00e4t zwischen C# und JavaScript (IJSRuntime, IJSObjectReference, IJSInProcessRuntime und IJSInProcessObjectReference) um neue Mitglieder. InvokeNew() und InvokeNewAsync() erzeugen eine Instanz von einem JavaScript-Objekt. Au\u00dferdem gibt es Methoden, um Objekteigenschaften zu lesen (GetValue() und GetValueAsync()) und zu setzen (SetValue() und SetValueAsync()).<\/p>\n<p>Bisher konnte man von C# aus nur Funktionen in JavaScript mit Invoke(), InvokeVoid(), InvokeAsync() und InvokeVoidAsync() aufrufen. Die neuen Interopabilit\u00e4tsmethoden vermeiden in einigen F\u00e4llen, dass man eine JavaScript-Funktion schreiben muss. Stattdessen kann man nun direkt Objekte erzeugen und Werte lesen sowie schreiben. F\u00fcr die JavaScript-Klasse<\/p>\n<p>window.TestClass = class {<br \/>\n  constructor(text) {<br \/>\n    this.text = text;<br \/>\n  }<\/p>\n<p>  getTextLength() {<br \/>\n    return this.text.length;<br \/>\n  }<br \/>\n}<\/p>\n<p>zeigt ein Codebeispiel in den Release Notes, den Einsatz der neuen Methoden:<\/p>\n<p>var jsObj = await JSRuntime.InvokeNewAsync(&#8222;jsInterop.TestClass&#8220;, &#8222;Blazor!&#8220;);<br \/>\nvar text = await jsObj.GetValueAsync(&#8222;text&#8220;);<br \/>\nvar textLength = await jsObj.InvokeAsync(&#8222;getTextLength&#8220;);<\/p>\n","protected":false},"excerpt":{"rendered":".NET 10.0 Preview 4 steht seit gestern zum Download auf der .NET-Downloadseite bereit. Die Neuerungen betreffen insbesondere die&hellip;\n","protected":false},"author":2,"featured_media":109896,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[135],"tags":[14235,14236,43022,43023,29,30,196,199,190,189,194,191,43024,193,192],"class_list":{"0":"post-109895","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-wissenschaft-technik","8":"tag-net","9":"tag-net-10-0","10":"tag-asp-net","11":"tag-blazor","12":"tag-deutschland","13":"tag-germany","14":"tag-it","15":"tag-microsoft","16":"tag-science","17":"tag-science-technology","18":"tag-technik","19":"tag-technology","20":"tag-webframework","21":"tag-wissenschaft","22":"tag-wissenschaft-technik"},"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@de\/114506162834140988","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/posts\/109895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/comments?post=109895"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/posts\/109895\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/media\/109896"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/media?parent=109895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/categories?post=109895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/de\/wp-json\/wp\/v2\/tags?post=109895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}