ASP.NET Core updates in .NET 6 Preview 5

Daniel

.NET 6 Preview 5 is now available and includes many great new improvements to ASP.NET Core.

Here’s what’s new in this preview release:

  • .NET Hot Reload updates for dotnet watch
  • ASP.NET Core SPA templates updated to Angular 11 and React 17
  • Use Razor syntax in SVG foreignObject elements
  • Specify null for Action and RenderFragment component parameters
  • Reduced Blazor WebAssembly download size with runtime relinking
  • Configurable buffer threshold before writing to disk in Json.NET output formatter
  • Subcategories for better filtering of Kestrel logs
  • Faster get and set for HTTP headers
  • Configurable unconsumed incoming buffer size for IIS

Get started

To get started with ASP.NET Core in .NET 6 Preview 5, install the .NET 6 SDK.

Note: If you installed .NET 6 Preview 4 previously (either directly or by installing .NET MAUI), then you may run into issues installing and running .NET 6 Preview 5. See the .NET 6 Known Issues for instructions on how to fix up your installation.

If you’re on Windows using Visual Studio, we recommend installing the latest preview of Visual Studio 2019 16.11. Visual Studio 2022 Preview 1 is also releasing today and .NET 6 Preview 5 is included in that release. If you’re on macOS, we recommend installing the latest preview of Visual Studio 2019 for Mac 8.10.

To get setup with .NET MAUI & Blazor for cross-platform native apps, see the latest instructions in the .NET MAUI getting started guide. Be sure to also check out the Announcing .NET MAUI Preview 5 blog post for all the details on what’s new in .NET MAUI in this release.

Note: .NET MAUI is not yet supported in Visual Studio 2022 Preview 1. For .NET MAUI development, please use the latest preview of Visual Studio 2019 16.11 instead.

To install the latest .NET WebAssembly tools for ahead-of-time (AOT) compilation and runtime relinking, run the following command from an elevated command prompt:

dotnet workload install microsoft-net-sdk-blazorwebassembly-aot

If you’ve installed the .NET WebAssembly workload previously, you can update it to .NET 6 Preview 5 by running the following command from an elevated command prompt:

dotnet workload update

Note: There is a known issue with installing optional SDK workloads using the .NET 6 Preview 5 SDK included with Visual Studio 2022 Preview 1. To workaround this issue, install the .NET 6 Preview 5 SDK from https://dot.net/get-dotnet6 after installing Visual Studio 2022 Preview 1.

Upgrade an existing project

To upgrade an existing ASP.NET Core app from .NET 6 Preview 4 to .NET 6 Preview 5:

  • Update all Microsoft.AspNetCore.* package references to 6.0.0-preview.5.*.
  • Update all Microsoft.Extensions.* package references to 6.0.0-preview.5.*.

To upgrade a .NET MAUI Blazor app from .NET 6 Preview 4 to .NET 6 Preview 5 we recommend starting from a new .NET MAUI Blazor project created with the .NET 6 Preview 5 SDK and then copying code over from your original project.

See the full list of breaking changes in ASP.NET Core for .NET 6.

.NET Hot Reload updates for dotnet watch

We’ve been working on various improvements to .NET Hot Reload for .NET 6. Some of these improvements are available in .NET 6 Preview 5, while others are still a work in progress and will be refined in future preview updates.

You no longer need to specify hotReloadProfile in launchSettings.json to use .NET Hot Reload with dotnet watch. .NET Hot Reload with project appropriate behavior is now enabled by default.

When a code edit is made that cannot be hot reloaded (a “rude” edit), dotnet watch will now ask if you want to restart the app to apply the change:

watch : Unable to apply hot reload because of a rude edit. Rebuilding the app...
watch : Unable to handle changes to C:\Users\daroth\Desktop\BlazorApp\Pages\Index.razor.
watch : Do you want to restart your app - Yes (y) / No (n) / Always (a) / Never (v)?

These options have the following behaviors:

  • Choosing Yes will restart the app.
  • Choosing No won’t restart the app and will leave the app running without the changes applied.
  • Choosing Always will restart the app as needed when changes cannot be hot reloaded.
  • Choosing Never won’t restart the app and avoids future prompts.

You can always manually restart the app using Ctrl+R.

Note: There is a known issue in this release that selecting Always still continues to prompt for future rude edits. This will get addressed in a future preview release.

To disable support for .NET Hot Reload when using dotnet watch, use the --no-hot-reload command-line option.

.NET Hot Reload with dotnet watch will also now correctly detect rude edits Blazor WebAssembly apps. Changes applied to Blazor WebAssembly apps will get reapplied to the app when the browser is refreshed or the app is loaded in a separate browser tab or browser instance.

ASP.NET Core SPA templates updated to Angular 11 and React 17

The ASP.NET Core single-page app (SPA) templates for Angular and React have been updated to Angular 11 and React 17. We also expect to further update the Angular template to Angular 12 in a future .NET 6 preview release now that it’s been released.

Support Razor syntax in SVG foreignObject elements

You can now use Razor syntax, including the use of Blazor components, in SVG foreignObject elements:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
    <rect x="0" y="0" rx="10" ry="10" width="200" height="200" stroke="black" fill="none" />
    <foreignObject x="20" y="20" width="160" height="160">
        <p>@message</p>
    </foreignObject>
</svg>

@code {
    string message = "Wow, it's so nice that this text wraps like it's HTML...because that's what it is!";
}

We also did a bunch of verification and testing to make sure that Blazor has good support for SVG scenarios. We think Blazor’s SVG support is now in good shape. If you hit any issues using SVG in Blazor with this release, please let us know by creating issues on GitHub.

Specify null for Action and RenderFragment component parameters

You can now specify null for the value of Blazor component parameters of type Action and RenderFragment, which simplifies the authoring of components that take optional callback parameters or template parameters.

Reduced Blazor WebAssembly download size with runtime relinking

One of the largest parts of a default Blazor WebAssembly app is the WebAssembly based .NET runtime (dotnet.wasm) that the app carries with it. Blazor WebAssembly already has support for trimming unused code from the .NET core framework libraries. However, the download size of the runtime has been constant.

Not all of the runtime logic is needed by every app. For example, a large part of the runtime logic and related data files are for globalization scenarios. This globalization support enables Blazor WebAssembly apps to handle strings, numbers, dates, etc. based on the current culture. But for apps that don’t need this functionality, all that data and logic is just extra bits.

.NET apps that don’t need globalization functionality can opt out of it and use invariant globalization instead by setting the InvariantGlobalization property to true in their project files. In .NET 5, this would allow a Blazor WebAssembly app to avoid downloading globalization data, but the related logic in the .NET runtime would still be included.

In .NET 6 Preview 5, you can now use the .NET WebAssembly tools (the same tools used for .NET WebAssembly AOT compilation) to relink the runtime to remove unneeded logic and dramatically reduce the size of the runtime. If you have the .NET WebAssembly workload installed, runtime relinking is done automatically when you publish the app. The size reduction is particularly dramatic when using invariant globalization mode.

If you haven’t already, you can install the .NET WebAssembly tools by running the following command from an elevated command prompt:

dotnet workload install microsoft-net-sdk-blazorwebassembly-aot

The following table shows the transfer size of dotnet.wasm for a default Blazor WebAssembly project with .NET 5 and .NET 6:

dotnet.wasm Transfer size (kB)
.NET 5 default 884
.NET 6 default 780
.NET 6 relinked 756
.NET 6 invariant mode 393

Configurable buffer threshold before writing to disk in Json.NET output formatter

The Newtonsoft.Json output formatter by default buffers responses up to 32 KiB in memory before buffering to disk. This is to avoid performing synchronous IO, which can result in other side-effects such as thread starvation and application deadlocks. However, if your response if was larger than 32 KiB this resulted in a lot of avoidable disk I/O. You can now configure the memory threshold before buffering to disk.

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
            .AddNewtonsoftJson(options =>
            {
                options.OutputFormatterMemoryBufferThreshold = 48 * 1024;
            });
}

Note: We still recommend using the System.Text.Json output formatter unless you require the Newtonsoft.Json serializer for compatibility reasons. The System.Text.Json serializer is fully async and will work efficiently for any size payload.

Subcategories for better filtering of Kestrel logs

Prior to this change, enabling verbose logging for Kestrel was prohibitively expensive as all of Kestrel shared the same logging category name (Microsoft.AspNetCore.Server.Kestrel). We’ve now split up that category into multiple new subcategories:

  • Microsoft.AspNetCore.Server.Kestrel (current category): ApplicationError, ConnectionHeadResponseBodyWrite, ApplicationNeverCompleted, RequestBodyStart, RequestBodyDone, RequestBodyNotEntirelyRead, RequestBodyDrainTimedOut, ResponseMinimumDataRateNotSatisfied, InvalidResponseHeaderRemoved, HeartbeatSlow.
  • Microsoft.AspNetCore.Server.Kestrel.BadRequests: ConnectionBadRequest, RequestProcessingError, RequestBodyMinimumDataRateNotSatisfied.
  • Microsoft.AspNetCore.Server.Kestrel.Connections: ConnectionAccepted, ConnectionStart, ConnectionStop, ConnectionPause, ConnectionResume, ConnectionKeepAlive, ConnectionRejected, ConnectionDisconnect, NotAllConnectionsClosedGracefully, NotAllConnectionsAborted, ApplicationAbortedConnection.
  • Microsoft.AspNetCore.Server.Kestrel.Http2: Http2ConnectionError, Http2ConnectionClosing, Http2ConnectionClosed, Http2StreamError, Http2StreamResetAbort, HPackDecodingError, HPackEncodingError, Http2FrameReceived, Http2FrameSending, Http2MaxConcurrentStreamsReached.
  • Microsoft.AspNetCore.Server.Kestrel.Http3: Http3ConnectionError, Http3ConnectionClosing, Http3ConnectionClosed, Http3StreamAbort, Http3FrameReceived, Http3FrameSending.

While your existing rules will continue to work (log filtering applies rules with the longest matching category prefix), you can now be more selective on which rules you enable. For example, the observability overhead of enabling Debug logging for just bad requests is greatly reduced and can be achieved with the following configuration:

{
  "Logging": {
    "LogLevel": {
      "Microsoft.AspNetCore.Kestrel.BadRequests": "Debug"
    }
  }
}

Faster get and set for HTTP headers

We added new API to expose all common headers available on System.Net.Http.HeaderNames as properties on the Microsoft.AspNetCore.Http.IHeaderDictionary resulting in an easier to use API. For example, the in-line middleware below gets/sets both request and response headers using the new APIs:

app.Use(async (context, next) =>
{
    var hostHeader = context.Request.Headers.Host;
    app.Logger.LogInformation("Host header: {host}", hostHeader);
    context.Response.Headers.XPoweredBy = "ASP.NET Core 6.0-preview5";
    await next.Invoke(context);
    var dateHeader = context.Response.Headers.Date;
    app.Logger.LogInformation("Response date: {date}", dateHeader);
});

For implemented headers the get/set accessors are implemented by going directly to the field and bypassing the lookup. For non-implemented headers, the accessors can bypass the initial lookup against implemented headers and directly perform the Dictionary<string, StringValues> lookup. This results in faster access for both scenarios.

Method Branch Type Mean Op/s Delta
GetHeaders preview4 Plaintext 25.793 ns 38,770,569.6
GetHeaders preview5 Plaintext 12.775 ns 78,279,480.0 +101.9%
GetHeaders preview4 Common 121.355 ns 8,240,299.3
GetHeaders preview5 Common 37.598 ns 26,597,474.6 +222.8%
GetHeaders preview4 Unknown 366.456 ns 2,728,840.7
GetHeaders preview5 Unknown 223.472 ns 4,474,824.0 +64.0%
SetHeaders preview4 Plaintext 49.324 ns 20,273,931.8
SetHeaders preview5 Plaintext 34.996 ns 28,574,778.8 +40.9%
SetHeaders preview4 Common 635.060 ns 1,574,654.3
SetHeaders preview5 Common 108.041 ns 9,255,723.7 +487.7%
SetHeaders preview4 Unknown 1,439.945 ns 694,470.8
SetHeaders preview5 Unknown 517.067 ns 1,933,985.7 +178.4%

Configurable unconsumed incoming buffer size for IIS

Prior to this change, the IIS server only buffered 64 KiB of unconsumed request bodies. This resulted in reads being constrained to that maximum size, which impacts the performance when large incoming bodies such as large uploads. In .NET 6 Preview 5, we’ve changed the default buffer size from 64 KiB to 1 MiB which should result in improved throughput for large uploads. In our tests, a 700 MiB upload that used to take 9 seconds now only takes 2.5 seconds.

The downside of a larger buffer size is an increased per-request memory consumption when the app isn’t quickly reading from the request body. So, in addition to changing the default buffer size, we’ve also made the buffer size configurable, allowing you to tune it based on your workload.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<IISServerOptions>(
        options =>
        {
            options.MaxRequestBodySize = 64 * 1024;
        }
    );
}

Give feedback

We hope you enjoy this preview release of ASP.NET Core in .NET 6. We’re eager to hear about your experiences with this release. Let us know what you think by filing issues on GitHub.

Thanks for trying out ASP.NET Core!

52 comments

Comments are closed. Login to edit/delete your existing comments

  • Matías

    Thanks guys I’m following Blazor since Net 5 preview 3…It’s amazing how it has grow up from that time… I’m using it on some projects.

    By the way…nice presentation today on the BlazorDay…

      • Abhay Kumar

        Hi Daniel,
        Abhay here.I have been trying to set up the project theranchi.com into blazor server side app and struggling. In fact , this project has lot of Jquery and CSS files. According to theranchi.com UI i have kept all the Css,Jquery and images folders inside the wwwroot folder and then in _host.cshtml i kept css inside and then jquery in the bottom.
        Next to it , in Nav.razor kept Header menus also created one footer.razor and kept footer there.
        Going to index.razor i used the slider and rest of the contents .

        Problem- Jquery for the slider is in _host.cshtml as i am not allowed to put inside index.razor so its not working . please assist me so that i can complete it .
        Either you tell me that if i can use tag inside index.razor component or why index.razor not being served with the Jquery of slider placed inside _host.cshtml even the Jquery is being properly loaded in the browser.

        Would wait for reply.

        Thanks

        • Daniel RothMicrosoft employee

          Hi Abhay. It’s hard to know exactly what’s going on without taking a look at your code. I’m not really clear on what error your seeing or what exactly isn’t working. Referencing jQuery from _Host.cshtml is the right way to go. It sounds like you’re seeing jQuery get loaded in the browser correctly. There may be some interactions between jQuery and Blazor that are causing issues. Note that Blazor generally assumes that it has full control of the DOM that it renders. If another library, like jQuery, tries to manipulate the same DOM elements, nondeterministic things can happen.

  • Prem Shah

    I want to write a single modal which is going to use in Blazor App and Maui App.
    I am little bit confused regarding Implement INotify Interface Because Blazor do not need INotify Interface to be Implemented in its modal but Maui need.
    so here is my question

    1. Does is it good practise to use Single modal in Maui and Blazor App ?
    2. By using INotify interface for blazor is going to side effect or bad performace ?
    3. What is good Practise to use single modal in both Blazor and DotNet Maui ?

    Note : I am already aware of DotNet Maui For Blazor but it is not realated to my question.

  • Mark Stega

    Attempting to install the aot workload and getting

    C:\Users\ms>dotnet workload install microsoft-net-sdk-blazorwebassembly-aot
    
    Updated advertising manifest microsoft.net.sdk.android.
    Updated advertising manifest microsoft.net.sdk.ios.
    Updated advertising manifest microsoft.net.sdk.maccatalyst.
    Updated advertising manifest microsoft.net.sdk.macos.
    Updated advertising manifest microsoft.net.sdk.tvos.
    Updated advertising manifest microsoft.net.workload.mono.toolchain.
    Installing workload manifest microsoft.net.sdk.android version 30.0.100-preview.5.28.
    Workload installation failed, rolling back installed packs...
    Installing workload manifest microsoft.net.sdk.android version 30.0.100-preview.5.18.
    Installation roll back failed: Failed to install manifest microsoft.net.sdk.android version 30.0.100-preview.5.18: The transaction has aborted..
    Workload installation failed: Failed to install manifest microsoft.net.sdk.android version 30.0.100-preview.5.28: One or more errors occurred. (Access to the path 'C:\Program Files\dotnet\metadata\temp\microsoft.net.sdk.android.manifest-6.0.100\30.0.100-preview.5.28' is denied.).
    install
      Install a workload.
    
    Usage:
      dotnet [options] workload install [<PACKAGE_ID>...]
    
    Arguments:
      <PACKAGE_ID>  The NuGet Package Id of the workload to install.
    
    Options:
      --sdk-version <VERSION>                                                  The version of the SDK.
      --configfile <FILE>                                                      The NuGet configuration file to use.
      --add-source <SOURCE>                                                    Add an additional NuGet package source to use during installation.
      --skip-manifest-update                                                   Skip updating the workload manifests.
      --from-cache <from-cache>                                                Complete the operation from cache (offline).
      --download-to-cache <download-to-cache>                                  Download packages needed to install a workload to a folder which can be used for offline installation.
      --include-previews                                                       Allow prerelease workload manifests.
      --disable-parallel                                                       Prevent restoring multiple projects in parallel.
      --ignore-failed-sources                                                  Treat package source failures as warnings.
      --no-cache                                                               Do not cache packages and http requests.
      --interactive                                                            Allows the command to stop and wait for user input or action (for example to complete authentication).
      -v, --verbosity <d|detailed|diag|diagnostic|m|minimal|n|normal|q|quiet>  Set the MSBuild verbosity level. Allowed values are q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic].
      -?, -h, --help                                                           Show help and usage information
    

    I did install the SDK using the stand-alone installer after installing VS2022 P1

      • Mark Stega

        Dan,

        Thanks, using the elevated prompt did make the workload install run to successful completion.

        It’s really easy to miss the ‘elevated’ word in the install instructions. You might consider
        “from an ELEVATED command prompt”.

        As an aside, the quality of these previews is phenomenally great.

  • Mister Magoo

    I had a problem with the dotnet workload command – it did not recognise the “upgrade” part

    C:\>dotnet workload upgrade microsoft-net-sdk-blazorwebassembly-aot
    Required command was not provided.
    Unrecognized command or argument 'upgrade'
    Unrecognized command or argument 'microsoft-net-sdk-blazorwebassembly-aot'

    But dotnet workload update worked (sort of) – it installed the updated bits, but failed to do something at the end – with a JSON parsing error.
    I say it installed the updates because if I run it again, I see messaged saying the various bundles are already installed.

    Is there a repo to file an issue for this?

      • Daniel RothMicrosoft employee

        Ugh, it’s “update” no “upgrade”. Sorry about that! And you don’t need to specify the workload name. Just run `dotnet workload update`. I hope that helps!

  • Lohith GN

    Hi Dan. Great post as usual :). Blazor keeps getting better day by day. In my company we have switched over to Blazor WASM for any front end needs.

    Found a tiny typo – in section Reduced Blazor WebAssembly download size with runtime relinking: “Blazor WebAssembly already ahs support for trimming unused code” . This should be “Blazor WebAssembly already has support for trimming unused code”.

    Kudos to the team. Looking forward to more perf improvements.

    Good day…

  • Traktor Toni

    “Rude edit” is not a useful name. You have the information what edit caused the problem right? Please write it to the console that it was a filename change or a class name change or what exactly it was that caused the hot reload to fail because then I can know what to expect and I can get into a flow of programming.

    • Daniel RothMicrosoft employee

      Hi Traktor. Thanks for this feedback! We will provide detailed diagnostics in Visual Studio on what code changes could not be hot reloaded. If you’d like to see this level of detail on the command line as well, could you please open a GitHub issue for that?: https://github.com/dotnet/aspnetcore/issues. Thanks for trying out .NET 6!

  • Steven Hanquez

    I migrated my WebAPI project from Net5 to Net6.

    However, I am unable to update the “Microsoft.VisualStudio.Web.CodeGeneration.Design” package from “version 6.0.0 preview 4” to “version 6.0.0 preview 5”.

    I get this errors messages:
    Error Package restore failed. Rolling back package changes for ‘GMAO.Services.WebApi’.
    Error NU1102 Unable to find package System.ComponentModel.Annotations with version (>= 6.0.0-preview.5.21217.1)
    – Found 57 version(s) in nuget.org [ Nearest version: 6.0.0-preview.4.21253.7 ]
    – Found 2 version(s) in Microsoft Visual Studio Offline Packages [ Nearest version: 4.1.0 ] GMAO.Services.WebApi C:\Source\repos\GMAO\GMAO.Services.WebApi\GMAO.Services.WebApi.csproj 1

    • Daniel RothMicrosoft employee

      Hi Yasser. .NET Hot Reload works with .razor files when using dotnet watch, but isn’t enabled in Visual Studio yet. That’s coming in a future Visual Studio update.

      • Pavel Tamkovich

        dotnet watch for Blazor WebAssembly (didn’t test for other projects) doesn’t work at all. “watch : File changed: bla bla bla” and that’s all what I have. Page doesn’t reload\update, but also with manual reload I don’t have updated code. Please check and fix it.

        • Daniel RothMicrosoft employee

          Hi Pavel. I’m sorry dotnet watch isn’t working for you! We’ll need some more details on how to reproduce the issue you are seeing. When I try out dotnet watch with a default Blazor WebAssembly app in .NET 6 Preview 5 it seems to work. Could you please file a GitHub issue with details on the exact steps that you are trying that leads to this issue?: https://github.com/dotnet/aspnetcore/issues/new.

  • Steve Wasielewski

    Try to install “dotnet workload install microsoft-net-sdk-blazorwebassembly-aot” and getting the following error:

    System.IO.FileNotFoundException: Could not find file ‘C:\Program Files\dotnet\sdk-manifests\6.0.100\Microsoft.NET.Workload.Android\WorkloadManifest.json’.
    File name: ‘C:\Program Files\dotnet\sdk-manifests\6.0.100\Microsoft.NET.Workload.Android\WorkloadManifest.json’
    at System.IO.Strategies.FileStreamHelpers.ValidateFileHandle(SafeFileHandle fileHandle, String path, Boolean useAsyncIO) in System.Private.CoreLib.dll:token 0x6005b95+0x27
    at System.IO.Strategies.FileStreamHelpers.CreateFileOpenHandle(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) in System.Private.CoreLib.dll:token 0x6005b8f+0x7a
    at System.IO.Strategies.WindowsFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize) in System.Private.CoreLib.dll:token 0x6005c4f+0x23
    at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Int64 preallocationSize) in System.Private.CoreLib.dll:token 0x6005b8c+0x21
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, Int64 preallocationSize) in System.Private.CoreLib.dll:token 0x600585a+0x114
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) in System.Private.CoreLib.dll:token 0x6005855+0x0
    at System.IO.File.OpenRead(String path) in System.IO.FileSystem.dll:token 0x6000107+0x0
    at Microsoft.NET.Sdk.WorkloadManifestReader.SdkDirectoryWorkloadManifestProvider.GetManifests()+MoveNext() in Microsoft.DotNet.TemplateLocator.dll:token 0x6000021+0x5f
    at Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver.RefreshWorkloadManifests() in Microsoft.DotNet.TemplateLocator.dll:token 0x6000065+0x84
    at Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver..ctor(IWorkloadManifestProvider manifestProvider, String[] dotnetRootPaths, String[] currentRuntimeIdentifiers) in Microsoft.DotNet.TemplateLocator.dll:token 0x6000064+0x31
    at Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver.Create(IWorkloadManifestProvider manifestProvider, String dotnetRootPath, String sdkVersion) in Microsoft.DotNet.TemplateLocator.dll:token 0x6000062+0x8a

    at Microsoft.DotNet.Workloads.Workload.Install.WorkloadInstallCommand..ctor(ParseResult parseResult, IReporter reporter, IWorkloadResolver workloadResolver, IInstaller workloadInstaller, INuGetPackageDownloader nugetPackageDownloader, IWorkloadManifestUpdater workloadManifestUpdater, String dotnetDir, String userHome, String version) in dotnet.dll:token 0x60001bf+0xd6
    at Microsoft.DotNet.Workloads.Workload.WorkloadCommand.b__9_0(ParseResult appliedOption) in dotnet.dll:token 0x6000148+0x0
    at Microsoft.DotNet.Cli.DotNetTopLevelCommandBase.RunCommand(String[] args) in dotnet.dll:token 0x60008ca+0x44
    at Microsoft.DotNet.Workloads.Workload.WorkloadCommand.Run(String[] args) in dotnet.dll:token 0x6000146+0x6
    at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, TimeSpan startupTime, ITelemetry telemetryClient) in dotnet.dll:token 0x6000933+0x2e8
    at Microsoft.DotNet.Cli.Program.Main(String[] args) in dotnet.dll:token 0x6000931+0x6f

    • Daniel RothMicrosoft employee

      Hi Steve. I’m sorry you’re hitting issues! There are some known problems with workload installation in this release. Did you install .NET 6 Preview 5 via Visual Studio 2022 Preview 1? Or did you use the standalone installer for .NET 6 Preview 5?

      Also, if you’ve installed .NET MAUI previously with .NET 6 Preview 4, could you please try updating the maui-check tool and running maui-check again? This may help clean up the workloads.

      • Daniel RothMicrosoft employee

        This issue happens because some of the workloads were renamed in .NET 5 Preview 5. To work around this issue:

        In the .NET SDK installation folder, delete all folders under sdk-manifests\6.0.100 (for example, under C:\Program Files\dotnet\sdk-manifests\6.0.100) that have the form Microsoft.NET.Workload.*, EXCEPT for microsoft.net.workload.mono.toolchain.

  • Rod Macdonald

    Having been overly cautious regarding getting started with Blazor, I’m finally convinced it’s a superb framework with a brilliant feature set and community adoption which seems to be getting better and better by the day. I plan to use it desktop and web server. Two things:

    I fired up preview 4 three or so days ago to run an out of the box MAUI Blazor desktop instance. The desktop app seems to load but the window where I assume the usual counter/weather app demo should appear doesn’t load and instead all I get is a window which says MAUI Desktop but a plain Blazor colored (single hue blue/indigo) screen with nothing loading – it would be super nice to see this working – any ideas what could be wrong?;
    I missed the last couple of BlazorDay presentations including yours – is there any way I can catch up?

    Anyway, Blazor finally really does inspire me – it’s rekindled real .NET excitement.

      • Rod Macdonald

        Thanks Stephen, had managed to click on the video for 2020 where of course Dan is featured at the start and not the finish, dohhhh!

        postback: Just seen the video – awesome presentation!