Blazor Server:如何可靠地处理用户操作的延迟?
Blazor Server: How to reliably handle the delay of user actions?
比较 Blazor Server 和 Blazor WebAssembly,我发现一个显着的区别是 might/should 对应用程序设计有很大的影响。让我根据一个简单的要求来概述这种差异:
Clicking a button to increase a counter and whenever the counter reaches 10, the button will be disabled.
我们比较一下:
- Blazor WebAssembly:单击事件处理程序在用户单击按钮后直接在浏览器中同步执行。计数器增加并检查条件。如果计数器为 10,则使用 属性 绑定将禁用该按钮。用户不可能点击第十一次。
- Blazor 服务器:点击事件处理程序在服务器上异步执行,只有在点击事件已发布到通道并被服务器接收后。 这可能需要任意时间,具体取决于 Internet 连接。 服务器上的计数器增加并检查条件。然而,在浏览器获知按钮的潜在状态变化之前,用户可以单击按钮一次或多次,导致服务器上的事件处理程序再次执行,从而可能增加计数器超过允许的值。
作为使用 Blazor Server 的程序员,我不能再依赖我可能在 JavaScript 应用程序中习惯的用户交互事件的同步不间断处理。 我必须用额外的健全性检查来打乱我所有的事件处理程序,以确保没有意外发生。这也阻止了从 Blazor WebAssembly 到 Blazor Server 的直接迁移(坦率地说,反之亦然) .
请注意,我不相信延迟太小以至于在 GUI 更新之前没有真正的用户能够再次单击的论点。即使对于非常受控的网络条件,延迟也可能会意外发生。此外,依靠机会和外部因素从来都不是一个好的选择。还记得墨菲定律吗?
我的问题是:你在实践中是如何处理这个问题的?您是否费心在事件处理程序中编写所有这些完整性检查?
我会通过 javascript 禁用所有点击按钮并在保存后启用它们
我得出结论,为了在源代码级别平等对待 Blazor WebAssembly 和 Blazor Server,您必须为自己应用某些模式和限制,否则运行时行为可能会有所不同。
其中之一是 Blazor 服务器中发生的输入延迟。即使它是 - 或者 应该 是 - 小,如果你希望在从 WebAssembly 切换到服务器时防止讨厌的错误,你仍然必须解决它。
解决它的一种方法是使用代码保护每个事件处理程序(对用户交互事件做出反应),确保前端的状态确实可以安全地执行此处理程序。在“传统的”SPA Web 应用程序(如 Angular)中,无论如何都应该防止在服务器端进行不需要的操作,在 Blazor 应用程序中也是如此。但是,在 Blazor 应用程序中,您 还 还必须更加严密地保护您的前端,因为您不能依赖不间断的同步处理程序执行。
在我看来,Blazor 是一个漏洞抽象,因为 WebAssembly 和服务器之间的决定不仅仅是一个实现细节。
比较 Blazor Server 和 Blazor WebAssembly,我发现一个显着的区别是 might/should 对应用程序设计有很大的影响。让我根据一个简单的要求来概述这种差异:
Clicking a button to increase a counter and whenever the counter reaches 10, the button will be disabled.
我们比较一下:
- Blazor WebAssembly:单击事件处理程序在用户单击按钮后直接在浏览器中同步执行。计数器增加并检查条件。如果计数器为 10,则使用 属性 绑定将禁用该按钮。用户不可能点击第十一次。
- Blazor 服务器:点击事件处理程序在服务器上异步执行,只有在点击事件已发布到通道并被服务器接收后。 这可能需要任意时间,具体取决于 Internet 连接。 服务器上的计数器增加并检查条件。然而,在浏览器获知按钮的潜在状态变化之前,用户可以单击按钮一次或多次,导致服务器上的事件处理程序再次执行,从而可能增加计数器超过允许的值。
作为使用 Blazor Server 的程序员,我不能再依赖我可能在 JavaScript 应用程序中习惯的用户交互事件的同步不间断处理。 我必须用额外的健全性检查来打乱我所有的事件处理程序,以确保没有意外发生。这也阻止了从 Blazor WebAssembly 到 Blazor Server 的直接迁移(坦率地说,反之亦然) .
请注意,我不相信延迟太小以至于在 GUI 更新之前没有真正的用户能够再次单击的论点。即使对于非常受控的网络条件,延迟也可能会意外发生。此外,依靠机会和外部因素从来都不是一个好的选择。还记得墨菲定律吗?
我的问题是:你在实践中是如何处理这个问题的?您是否费心在事件处理程序中编写所有这些完整性检查?
我会通过 javascript 禁用所有点击按钮并在保存后启用它们
我得出结论,为了在源代码级别平等对待 Blazor WebAssembly 和 Blazor Server,您必须为自己应用某些模式和限制,否则运行时行为可能会有所不同。
其中之一是 Blazor 服务器中发生的输入延迟。即使它是 - 或者 应该 是 - 小,如果你希望在从 WebAssembly 切换到服务器时防止讨厌的错误,你仍然必须解决它。
解决它的一种方法是使用代码保护每个事件处理程序(对用户交互事件做出反应),确保前端的状态确实可以安全地执行此处理程序。在“传统的”SPA Web 应用程序(如 Angular)中,无论如何都应该防止在服务器端进行不需要的操作,在 Blazor 应用程序中也是如此。但是,在 Blazor 应用程序中,您 还 还必须更加严密地保护您的前端,因为您不能依赖不间断的同步处理程序执行。
在我看来,Blazor 是一个漏洞抽象,因为 WebAssembly 和服务器之间的决定不仅仅是一个实现细节。