PeakSWC.RemoteWebViewService.Lib
11.0.0
dotnet add package PeakSWC.RemoteWebViewService.Lib --version 11.0.0
NuGet\Install-Package PeakSWC.RemoteWebViewService.Lib -Version 11.0.0
<PackageReference Include="PeakSWC.RemoteWebViewService.Lib" Version="11.0.0" />
<PackageVersion Include="PeakSWC.RemoteWebViewService.Lib" Version="11.0.0" />
<PackageReference Include="PeakSWC.RemoteWebViewService.Lib" />
paket add PeakSWC.RemoteWebViewService.Lib --version 11.0.0
#r "nuget: PeakSWC.RemoteWebViewService.Lib, 11.0.0"
#:package PeakSWC.RemoteWebViewService.Lib@11.0.0
#addin nuget:?package=PeakSWC.RemoteWebViewService.Lib&version=11.0.0
#tool nuget:?package=PeakSWC.RemoteWebViewService.Lib&version=11.0.0
PeakSWC.RemoteWebViewService.Lib
The RemoteWebViewService as a library. The same code that runs as RemoteWebViewService.exe (and in the
Railway container) can be hosted inside your own process, for example a WPF or WinForms app that shows its
RemoteBlazorWebView UI in a local browser or a WebView2 iframe without a separate server process.
Embedded (in-process)
using PeakSWC.RemoteWebView;
// Loopback, plain HTTP, free ports. Returns once Kestrel is listening; does not block.
await using var server = await RemoteWebViewServer.StartAsync(new RemoteWebViewServerOptions
{
MaxClients = 1,
FrameAncestors = ["'self'", "https://host.example"], // optional
ConfigureLogging = lb => lb.AddDebug(), // optional; default is silent
});
blazorWebView.ServerUri = server.BaseUri; // browsers: http://127.0.0.1:<port>/
blazorWebView.GrpcBaseUri = server.GrpcUri; // native gRPC client: http://127.0.0.1:<grpcPort>/
// The page for a client is new Uri(server.BaseUri, $"app/{blazorWebView.Id}")
await server.StopAsync(); // or dispose
Port = 0(the default) binds a free port; read the real one fromserver.Port/server.BaseUri.- Plain HTTP is allowed only on a loopback address, so no development certificate is needed. Without TLS
there is no ALPN, so browsers (HTTP/1.1, gRPC-Web) and the native gRPC client (HTTP/2) get separate ports.
Set
UseHttps = true(dev certificate) orCertificateto serve both on one HTTPS port. - The embedded host does not change the current directory or thread pool, does not read the host app's
appsettings.jsonor environment variables, and does not hook Ctrl+C or process exit. MaxClientslimits concurrent RemoteWebView clients (a newCreateWebViewgets 503 /Unavailable); browser requests for connected clients are never blocked. WithMaxClients = 1the client-list and file-watcher services are not mapped. The agent hub (doc/Agents.md) is never mapped when embedded.FrameAncestorsaddsContent-Security-Policy: frame-ancestors ...to HTML responses and rejects cross-origin script calls whoseOriginis not listed. Same-origin calls are always allowed.
Experimental: agent registry
The agent registry (AgentHub / AgentAdmin, see doc/Agents.md in the repository) is experimental and may change or be
removed in any release. Its public types are marked [Experimental("RWV001")], so using them produces compiler diagnostic
RWV001; add <NoWarn>$(NoWarn);RWV001</NoWarn> to opt in. The rest of this package is not affected.
Standalone
RemoteWebViewServer.Run(args); // what RemoteWebViewService.exe does
RemoteWebViewServer.Run(5001, maxNumClients: 1, frameAncestors: ["'self'"]); // blocking, HTTPS on loopback
Two-way voice for WPF sessions
Set BlazorWebView.EnableVoice = true before setting HostPage. Use HTTPS for the browser and host connections, and deploy a relay built with voice support. Open the controller through /app/{id} to get its one-time voice grant. In deployments without sign-in, treat the controller link as a credential. Mirror pages have no voice controls or grant.
The controller can request a call. The person at the PC accepts or declines in a separate local WebView2 window. Both sides can mute or hang up, and closing either endpoint ends the call. Voice uses the default input and output devices. The relay forwards call setup messages and WebRTC carries audio directly or through TURN.
Configure Voice__StunUrl for STUN and Voice__TurnUrl with Voice__TurnSecret for a TURN server that supports shared-secret credentials. For example, use turns:turn.example.com:443?transport=tcp for a TURN TLS listener on port 443. Keep the TURN secret on the relay. Configure the HTTPS proxy to forward WebSocket upgrades and preserve the public Host header on /voice/{id}/signal.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net11.0 is compatible. |
-
net11.0
- Google.Protobuf (>= 3.36.2)
- Grpc.AspNetCore.Server (>= 2.85.0)
- Grpc.AspNetCore.Web (>= 2.85.0)
- Microsoft.AspNetCore.Components.WebAssembly.Server (>= 11.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Based on maui 11.0.0
Changes since 11.0.0-rc2
Merge branch 'claude/net11-port-shared-control': net10's shared control work on the released .NET 11 (11.0.0)
net11: no pack hook or package reference that net11 had already removed
Release process doc: net11 numbers and how EditWebView runs on this line
Upstream source from aspnetcore 11.0.0 and MAUI 11.0.10 (EditWebView run)
net11: keep net11's own module-initializer end-to-end tests
net11: the ported cache test passes the cache-control value net11's helper needs
net11 on the released .NET 11: SDK 11.0.100, packages 11.0.0, version 11.0.0
Port net10 since the last sync: shared control, owner key, sign-in providers, opt-in session bar
Document EditWebView in the release process.
Merge pull request #80 from budcribar/claude/net11-escape-release-notes
Escape commas and semicolons in the release notes passed to dotnet pack
Merge pull request #77 from budcribar/claude/net11-port-net10-release
Retarget the ported net10 projects to net11
Prepare NuGet release packaging, CI test coverage, and remote component contract hardening
RemoteComponentHost: ExitWhenInputCloses, exit when stdin ends instead of polling
Keep remote component frames from restarting when the app is mirrored
Mark agent registry (AgentHub/AgentAdmin) experimental (RWV001)
Restore Authorization package references in RemoteWebViewService.Lib
Describe agents and the embedded relay without naming one app
Remote components README: use a generic contract example
Remote components: describe the use generically
Add the [RemoteComponentContract] source generator
Add remote components: runtime and the WPF RemoteComponentHost
Add ReverseMirror to [RemoteBlazor]
Add the [RemoteBlazor] source generator
Port the net9 test-runner and window-sizing fixes.
Install nvm-windows when RunTests.ps1 cannot find nvm.
Throw the frame-ancestor error after the scan.
Name the first invalid frame ancestor after valid ones.
Merge pull request #66 from budcribar/net11-bugbounty-fixes
Port Bug02, Bug03 (dispose-on-throw), Bug06, Bug15, Bug44, and Bug60 fixes and regression tests
Pin net11 to the rc.3 SDK and the patched Graph/Kiota line.
Update net11 dependencies to current rc.3 and stable releases.
Pin global.json to the SDK shipped by the 11.0-preview image.
Fix Sonar reliability and security findings that are safe to backport.
Merge pull request #65 from budcribar/claude/net11-port-net10
Target net11 in the ported embedded-relay library, sample and server branch CI
Let pages in opaque-origin sandboxed iframes connect
Synchronize primary browser scrolling to read-only mirrors
EmbeddedRelayWpf: embed wwwroot so a single-file publish works
EmbeddedRelayWpf: target Windows 10 SDK and show crashes
Copy RemoteWebViewService.Lib into the Docker build and server CI paths
Split RemoteWebViewService into an embeddable library for net10
Gate AgentAdmin starts with AGENT_ADMIN_KEY and guard in-flight starts
Add the agent registry (AgentHub / AgentAdmin) to RemoteWebViewService
Add Linux container mode with Kestrel TLS/HTTP2 for Railway TCP proxy.
Remove net10-only Program.IsContainerMode reference from Startup.cs on net11
Add in-memory event log provider for GetLoggedEvents on Linux
Fail the performance check when the baseline has no samples.
Add the net11 intermittent CI failure log.
Record the nuget.org user and required reviewer.
Generate PackageReleaseNotes for the maintainer to commit.
Spell package suffixes without a dot and add a patch counter.
Draft the package release workflow without a NuGet push.
Add a draft release workflow skeleton.
Read Chrome output on a dedicated thread before waiting for DevTools.
Retry a timed-out DevTools probe and keep the Chrome module classes in one collection.
Measure TestConnectedEvent from the Connected signal, not the pause.
Note SYSLIB1044 on the base-href regex as won't fix.
Full list: https://github.com/budcribar/RemoteBlazorWebView/compare/11.0.0-rc2...24c67bf600e845754a3edfc138ccc97c6f2ccb00