我将编写一个具有数千个并发用户的应用程序。此应用程序中的大多数页面都是标准 CRUD 页面,常规 ASP.NET Core Razor 页面应用程序就可以满足这些需求。
只有几个页面需要 Blazor 服务器端渲染应用程序的完整页面交互性和丰富性,因此我不想在这些其他页面上产生与服务器的持久 Web 套接字连接的开销。
我认为理论上的完美架构是创建一个引用 Razor 类库的 ASP.NET Core Razor 页面应用程序。然后,Razor 类库将包含需要具有 Blazor 功能的组件,我将简单地使用需要它的应用程序的几页中的这些组件。我的希望是,仅针对托管 Razor (Blazor) 组件之一的页面建立 Web 套接字连接,而其余页面根本不需要或根本不需要 Web 套接字连接。
然而,事实并非如此。当我将 Razor 页面应用程序旋转到主页(该主页上没有 Razor 组件)时,立即建立 Blazor Web 套接字连接。
我按照这篇 Microsoft 文章中的步骤进行设置:
https://learn.microsoft.com/en-us/aspnet/core/blazor/components/integration?view=aspnetcore-8.0
它解释了我必须通过将这些行添加到
Program.cs
文件来将交互式服务器组件添加到 Razor Pages 应用程序:
// ...
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
// ...
app.MapRazorComponents<App>().AddInteractiveServerRenderMode();
并将 Blazor javascript 引用添加到
_Layout.cshtml
文件。
<script src="_framework/blazor.web.js"></script>
我假设它会在需要时建立 Web 套接字,但我相当确定这些注册是导致整个应用程序立即进行 Web 套接字连接的原因。有没有办法只为需要它的页面建立按需连接,并在其他地方完全保持“普通剃刀页面”?
提前感谢您的帮助!
我假设它会在需要时建立 Web 套接字,但我相当确定这些注册是导致整个应用程序立即进行 WebSocket 连接的原因
不正确。 如果您设置正确,它就会执行您认为应该执行的操作。
我做了一些假设:
使用 Blazor Web 应用程序模板添加解决方案。 选择 InteractiveServer 和 Per Page/Component 交互性。
您将获得一个包含 3 页的项目:
在所有情况下,
Routes
和 MainLayout
均在服务器上静态呈现。 Body
内容组件仅在设置时以交互方式呈现。
调试解决方案并查看浏览器中的开发人员工具。只有
Counter
页面会建立 WebSocket 连接,当您离开交互式页面时,该连接会关闭。
请参阅下面的屏幕截图:
Home - 没有网络套接字连接。
计数器 - 活动的 Web 套接字连接
天气 - 没有活动的网络套接字 - 标记为已完成。
所有静态 CRUD 页面都应该像主页或天气一样构建。 您的几个交互式页面,例如
Counter
。 您可以将内容移至单独的库中,但适用相同的基本规则。 只需确保路由器可以看到组件来搜寻路线即可。