Blazor WASM 应用中的 "ASP.NET Core Hosted" 的目的是什么?

9
在Visual Studio 2022中创建新的Blazor WebAssembly应用程序时,有一个“ASP.NET Core托管”选项(带有无用的工具提示)。

enter image description here

如果您选择在解决方案中勾选此项,而不是一个WASM项目,则会有3个:客户端(WASM)、共享和服务器。
Blazor服务器应用程序没有页面,尽管它是启动项目。运行时,它调用WASM Blazor客户端应用程序。
我找不到解释这样做的目的是什么?如果我将WASM应用程序部署到IIS服务器上,即使没有服务器应用程序,它也可以正常运行。
请注意,我不是要问Blazor服务器(在服务器上运行的服务器端代码向客户端发送HTML)和Blazor客户端WASM(编译为WebAssembly并在浏览器中运行的C#代码)之间的区别。我知道这一点。
我想知道的是,如果您打算创建WASM应用程序,为什么要在解决方案中使用带有Blazor WASM应用程序的Blazor服务器应用程序。
我找不到直接的答案。或者说,这篇文章没有回答它——或者我漏掉了什么: ASP.NET Core托管和服务器端Blazor之间有什么区别,真的吗? 我找不到其他内容。
那么,Blazor Server应用程序的目的是什么,为什么先运行它然后再调用WASM应用程序。另外,您如何托管它?
谢谢。
更新:
我知道WASM应用程序只能在客户端上运行,您需要一个Web API项目来连接以从Web服务器中提取数据。
这个“.net Core Hosted”模板是否做了一些我不能通过创建一个WASM项目的解决方案自己完成的事情 - 然后添加Web API项目(和各种共享项目)?

拥有服务器可以简化提供API控制器和中心的过程。 - Brian Parker
Blazor Server 应用程序没有页面:但是,当您使用 MS Identity 进行登录时,它将会有页面。因为这需要使用 Razor 页面。 - H H
1个回答

21
Blazor 服务器应用程序几乎像分布式桌面应用程序一样工作。浏览器上的每个事件都会发送到服务器,服务器处理事件,计算 DOM 中的结果更改,并发送差异化的 DOM,然后由浏览器端 JavaScript 应用到页面并更新页面。
在这里使用传统的 web API 风格模式是完全可选的。在 Blazor 服务器应用程序中,您无需编写单个 web API 即可使应用程序运行。一切都可以像单个桌面应用程序一样编写。
WebAssembly 应用程序更加丰富。该应用程序实际上在浏览器上运行,所有内容(事件处理、UI 刷新等)都在客户端完成。这些被称为“静态应用/网站”,一旦加载,就不需要执行其他操作。想象一下单人闪存式游戏——它们不需要连接数据库/应用程序服务器。
然而,几乎没有任何丰富的应用程序不需要基本的数据库连接。那么,例如维护排行榜的游戏应用程序如何与远程维护应用程序数据的应用程序服务器和数据库通信呢?
这就是托管模型派上用场的地方。在典型的 Web 应用程序场景中,您实际上需要三个组件:1) 客户端代码——应用程序 2) 服务器端代码——Web API——维护状态 3) 共享对象模型——以便前两者可以无缝通信。这就是在“.net core托管”选项中所看到的内容。该模板为所有三个组件创建样板文件。将被客户端和服务器使用的类放置在共享项目中。服务器端和客户端逻辑存在于它们各自的项目中,并且两者都引用了共享项目,而不是相互引用。
是否有必要运行WebAssembly应用程序? 不是必须的。您可以在任何平台上编写服务器端逻辑 - 它不需要是asp.net - 并从Blazor WebAssembly应用程序调用该API。但是,您仍将创建用于客户端服务器通信类的映射器。 .net core托管选项提供了一种非常方便的方法来完成这个过程。

谢谢。这是一个有用的模板。我是否仍然需要使用WebAPI(JSON等),JWT等来获取服务器上的数据以在应用程序中显示,登录等?还是这个模板提供了其他的方法来实现这些功能? - niico
模板和我只是使用 Blazor WASM 项目创建解决方案,然后添加 Web API 项目、模型项目等有根本区别吗? - niico
因为客户端和服务器共享相同的对象模型,所以JSON序列化只是使用现成的.NET Core库JSON类进行POST和读取响应的问题。您不需要额外的映射。通过JWT,我想您在谈论身份验证。您可以选择从下拉列表中选择一个捆绑的身份验证模式(“身份验证类型”)。如果您想设置其他身份验证,则必须编写自己的代码。 - Mayur Ekbote
这篇文章说“.net Core hosting”在某些方面使用了SignalR:https://www.syncfusion.com/blogs/post/3-blazor-hosting-models.aspx 所以它不仅仅为您创建了一个Web API?! - niico
删除了我的评论。托管模型的重点在于允许客户端服务器解耦,并让开发人员选择客户端服务器通信的方式 - WebAPI、gRPC、SignalR或任何其他方式。因此,这可能包括SignalR。不希望读者认为SignalR仅适用于Blazor服务器或其他任何内容。例如,在多人游戏或聊天应用程序中,您将希望使用SignalR hub进行通信。 - Mayur Ekbote

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接