一个“问题”的问题太多了
问题:但 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 推送到客户端浏览器进行显示。
希望这可以帮助...