具有动态 UI 与远程 SQL 服务器通信的 Blazor 应用程序的哪种托管模型?

Which hosting model for Blazor application with dynamic UI talking to remote SQL Server?

如果您想移植一个 "legacy" ASP.NET 应用程序,该应用程序通过 System.Data.SqlCient 方法 运行 从远程 SQL 服务器实例获取数据HttpHandler 的代码隐藏(从服务器返回的数据被 jsonified 并注入 UI 小部件,例如 kendoUI),什么是合适的 Blazor 托管模型?

  Blazor server-side  
  Blazor ASP.NET Core Hosted 
  Blazor client-side

从Visual Studio 2019 Preview offer Blazor (server-side)的描述来看:

... This template can be used for web applications with rich dynamic user interfaces...

Blazor (server-side) 似乎是正确的选择。

但是 SignalR 是否为您提供了使用 Blazor (ASP.NET Core hosted) 的方法? Visual Studio 表示此托管模型 "runs on WebAssembly and is hosted on an ASP.NET Core server" 但我不确定这到底是什么意思。 WebAssembly 运行 在哪里?客户?服务器?两个地方?

能否将 SignalRBlazor (ASP.NET Core hosted) 模型一起用于创建从服务器端 WebAssembly 到客户端 WebAssembly 的管道,从而避免需要对于 HttpHandler?

Whosebug 上对 SignalR 的描述表明它的功能近乎神奇:

ASP.NET SignalR ... makes it incredibly simple to add real-time web functionality to your applications...to have your server-side code push content to the connected clients as it happens, in real-time.
[my emphasis]

暂时忽略与问题无关的 "as it happens, in real-time" 短语,是否可以使用相同的管道将任何(较小的)数据集推送到 "connected client"?这是我要问的遗留 "intranet" 应用程序,顺便说一句,只有几十个用户。

单个“问题”的问题太多了

问题:但是 SignalR 是否为您提供了使用 Blazor(ASP.NET 核心托管)的方法?

回答:换句话说,您的问题是 client-side Blazor 是否可以使用 SingleR,对吗?答案是肯定的...

问题:Visual Studio 说这个托管模型 "runs on WebAssembly and is hosted on an ASP.NET Core server" 但我不确定这到底是什么意思。 WebAssembly 运行ning 在哪里?客户?服务器?两个地方?

回答:Client-side Blazor 在客户端浏览器上执行。 Blazor client-side 被编译成 WebAssembly 的 mono 运行 时间执行。 WebAssembly 不能 运行 在 server.It 上被设计为 运行 在网络上,与 JavaScript 一起。 Blazor client-side 托管在服务器上,它是一个 Asp.Net 核心项目。

问题:SignalR 能否与 Blazor(ASP.NET 核心托管)模型一起用于创建从 server-side WebAssembly 到 client-side WebAssembly 的管道,从而避免需要HttpHandler?

答案:没有这样的动物server-side WebAssembly。您可以使用 Web Api 启用 Blazor client-side 和服务器之间的通信。在这种情况下,您将不得不使用 HttpClient 服务。 注意:您也可以使用 SignleR,因为 real-time 这样的通信是必不可少的。

什么是 HttpHandler?一个 web Api 控制器是一个 HttpHandler...这种控制器中的一个动作(路由端点)是一个 HttpHandler... 名称并不重要。问题是你想解决什么问题

在我看来,您最好使用 Server-side Blazor 创建您的应用程序,在这种情况下,您可以使用 HttpClient 服务,或者可能根本不使用 HttpClient,而是定义一个推送数据到浏览器,毕竟你的代码是在服务端执行的,数据是通过SignleR推送到浏览器的。

更新:

问题:@Isaac:感谢您解决问题 :) 我的根本问题是,在 Blazor Web 应用程序中,server-side 代码是否(以某种方式)能够更新 UI直接组件,也许通过 SignalR 上的一些 RPC 机制,这将消除向客户端公开路由端点的需要并消除 Ajax。我认为 WASM 也可以 运行 server-side。就客户端数量(相对较少)而言,我正在考虑内联网应用程序,而不是互联网应用程序。

答案:在浏览器中创建一个带有输入 [type=text] 和按钮控件 "Click me" 的页面。同样,此页面在浏览器中 运行ning。它可能是 client-side Blazor,但也可能是 server-side Blazor。我知道这个秘密,我要告诉你。我们亲爱的应用程序是 Blazor server-side。现在在输入框中输入一个值并点击 "Click me" 按钮。单击按钮后,SignleR 立即传递您输入的数据以及事件类型等所有详细信息。简而言之,事件在服务器上执行。不 Ajax,就您而言... SignleR 的工作方式在这里并不重要。了解您的代码是在服务器上执行而不是在客户端上执行的必要条件,就像您使用 Client-side Blazor (WebAssembly) 时发生的那样。

正如我在上面所说的,您的代码是在服务器上执行的,因此您不必向客户端公开路由端点。您可以简单地在您的应用程序中定义一个服务,将其注入 DI 容器,然后使用它来调用其上的方法来做一些有趣的事情...

新更新:

提问:谢谢。如果用户的 button-click 将文本框中的文本发送到服务器,服务器使用 text-value 作为 search-term 进行数据库查询,然后服务器需要发回数据集怎么办给客户端填充网格?服务器是否(远程)调用 client-side 方法并将数据作为参数提供给 client-side 方法?

从您的问题中不清楚您所涉及的执行模式。但是,此处描述的执行流程可能与 client-side Blazor 和 server-side Blazor 都相关。

当用户点击按钮时,在客户端应用程序上定义的事件处理程序和在浏览器上 运行ning(请注意,这可以是 client-side Blazor 或 server-side Blazor ), 被触发。此处理程序可能会使用注入的 HttpClient 来发送文本框的内容,并等待响应(如果幸运的话,包含您搜索到的数据)。我想您知道如何使用 HttpClient 对象,对吧?你 post 一个请求,然后你得到一个响应。检索到的数据可以分配给局部变量,并绑定到可以在网格中显示数据的 table 元素。

我希望您明白 http 请求是 posted 到服务器上定义的控制器 class;那就是你使用 Web Api.

此事件流在 client-side 和 server-side 执行模式中同样相同。

但是,由于您的应用程序是在服务器上执行的,因此当您使用 server-side Blazor 时,您不必使用 Web Api,而是可以定义一个服务returns 需要的数据。请注意,请求数据、查询数据库、返回数据、执行代码、渲染 html 等都发生在服务器上,最后一个 SignleR 方法将 HTML 差异推送到用于显示的客户端浏览器。

希望这对您有所帮助...

that fetches data from a remote SQL Server instance by way of System.Data.SqlCient

那部分肯定会 运行 在服务器上。浏览器中没有SqlClient。
运行 Blazor server-side 应该可以工作。您不必直接处理 SignalR。

running in the code-behind of a HttpHandler (the data returned from the server gets jsonified and ...

这听起来很适合托管模型:API 服务器向客户端公开端点。它会给你留下最好的架构,但它可能需要更多的工作。

我已经设置了使用 MySQL 数据库的客户端 Blazor 应用程序。我的做法是对数据库和 Blazor 应用程序之间的所有事务使用基于 PHP 的 REST API。我还为它添加了一些登录安全性,在 PHP 中也做得很好,并在 MySQL 数据库中为每个登录存储一些令牌,然后在一段时间后超时,没有使用该令牌的该登录的新调用或那个登录名。

到目前为止,我对这个解决方案非常满意,因为它在服务器和应用程序方面提供了很大的自由度。主要的缺点是,根据应用程序的重量,它可能需要客户端提供相当多的信息。但是服务器要求非常低,尽管几乎任何东西都可以 运行 PHP / MySQL 服务器。

ASP 应该非常接近 PHP,因此使用 ASP.

应该可以得到类似的解决方案