Search code examples
asp.net-coreblazorblazor-server-sideblazor-webassembly

InteractiveWebAssembly page seems to require services to be declared on both server and client sides


I'm migrating by Blazor WebAssembly project to .net 8 "Blazor Web App" project, which supports both client and server rendering content.

I'm a bit confused by how IoC work. That's something that the doc does not mention, but clearly reproduced on brand new "Blazor Web App" project: For pages defined as @rendermode InteractiveWebAssembly (for example Counter.razor with injected services like @inject ITestIoc testIoc) I have to define service ITestIoc in 2 places: Program.cs of client project and Program.cs of the server project, even if it's only used inside wasm. If I miss one place, it throws exception that ITestIoc service is not defined.

What probably happens it renders the InteractiveWebAssembly page on the server side first, and then all further interactions carrying via wasm. So WebAssembly in "Blazor Web App" seems to be treated differently from what it used to be in a regular WebAssembly project. I know there is another type of WebAssembly type of project, that supports wasm only, but I want to have server side at my disposal too. So I wonder if there is any way around it, if I want for some pages having wasm-only rendering, no server rendering at all?


Solution

  • Because @rendermode InteractiveWebAssembly page still get prerendered in server. So you need register service in server project.
    To disable prerender, you could use
    @rendermode @(new InteractiveWebAssemblyRenderMode(prerender:false)) or
    @rendermode @(new InteractiveWebAssemblyRenderMode(false))
    If you have global RenderMode in App.razor, also set them like

    <HeadOutlet @rendermode=@(new InteractiveWebAssemblyRenderMode(false)) />
    <Routes @rendermode=@(new InteractiveWebAssemblyRenderMode(false)) />