1

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

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

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

...此模板可用于具有丰富动态用户界面的 Web 应用程序...

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

但是确实SignalR给你一种使用方式Blazor (ASP.NET Core hosted)吗?Visual Studio 说这个托管模型“在 WebAssembly 上运行并托管在 ASP.NET Core 服务器上”,但我不确定这到底意味着什么。WebAssembly 在哪里运行?客户?服务器?两个地方?

可以SignalRBlazor (ASP.NET Core hosted)模型一起用于创建从服务器WebAssembly端到客户端的管道,WebAssembly从而消除对HttpHandler?

StackOverflow 上对 SignalR 的描述表明它的功能几乎是神奇的:

ASP.NET SignalR ... 使向应用程序添加实时 Web 功能变得异常简单...让您的服务器端代码在发生时将内容实时推送到连接的客户端。
[我的重点]

暂时忽略“实时发生”短语与问题无关,可以使用相同的管道将任何(小型)数据集推送到“连接的客户端”吗?这是一个遗留的“内部网”应用程序,我要问的是,顺便说一句,只有几十个用户。

4

3 回答 3

2

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

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

答:换句话说,您的问题是 SingleR 是否可以在客户端 Blazor 中使用,对吗?答案是肯定的……

问:Visual Studio 说这个托管模型“在 WebAssembly 上运行并托管在 ASP.NET Core 服务器上”,但我不确定这到底是什么意思。WebAssembly 在哪里运行?客户?服务器?两个地方?

答:客户端 Blazor 在客户端浏览器上执行。Blazor 客户端由编译为 WebAssembly 的单声道运行时执行。WebAssembly 不能在服务器上运行。它旨在与 JavaScript 一起在 Web 上运行。Blazor 客户端托管在服务器上,它是一个 Asp.Net Core 项目。

问题:SignalR 是否可以与 Blazor(ASP.NET Core 托管)模型一起用于创建从服务器端 WebAssembly 到客户端 WebAssembly 的管道,从而消除对 HttpHandler 的需求?

答:没有这样的动物服务器端 WebAssembly。您可以使用 Web Api 启用 Blazor 客户端和服务器之间的通信。在这种情况下,您将不得不使用 HttpClient 服务。注意:您也可以使用 SignleR 进行此类实时通信,这是必不可少的。

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

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

更新

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

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

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

新更新:

问:谢谢。如果用户单击按钮将文本框中的文本发送到服务器,服务器使用文本值作为搜索词进行数据库查询,然后服务器需要将数据集发送回客户端以填充网格?服务器是否调用(远程)客户端方法并将数据作为参数提供给客户端方法?

从您的问题中不清楚您与哪种执行方式有关。但是,此处描述的执行流程可能与客户端 Blazor 和服务器端 Blazor 相关。

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

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

同样,在客户端和服务器端执行模式中,此事件流是相同的。

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

希望这可以帮助...

于 2019-06-19T12:13:50.160 回答
1

通过 System.Data.SqlCient 从远程 SQL Server 实例获取数据

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

在 HttpHandler 的代码隐藏中运行(从服务器返回的数据被 jsonified 和 ...

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

于 2019-06-20T05:58:06.500 回答
0

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

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

ASP 应该非常接近 PHP,因此使用 ASP 应该可以实现类似的解决方案。

于 2021-11-05T11:15:03.400 回答