我只是在学习 Websharper,但在短期内,我有一个要解决的业务问题。我编写了一个服务器和基于 WPF 的客户端,它允许用户使用滑块等控件改变输入并实时从服务器获取反馈(即没有“提交”按钮)。
我想使用 Websharper 将此桌面 GUI 应用程序转换为 Web 应用程序。如何对由用户滑动和滑块触发的服务器进行后台请求响应,并在网页中异步可视化反馈?
我只是在学习 Websharper,但在短期内,我有一个要解决的业务问题。我编写了一个服务器和基于 WPF 的客户端,它允许用户使用滑块等控件改变输入并实时从服务器获取反馈(即没有“提交”按钮)。
我想使用 Websharper 将此桌面 GUI 应用程序转换为 Web 应用程序。如何对由用户滑动和滑块触发的服务器进行后台请求响应,并在网页中异步可视化反馈?
我想最明显的方法是简单地为您的服务器端逻辑制作一堆[<Rpc>]
-decorated 方法,然后在 UI 中的任何更改上简单地调用它们。IIRC,Websharper 透明地处理客户端-服务器转换,即如果您调用服务器方法,必要的代理将触发以获取结果。
正如已经指出的那样,您可能会依赖 RPC 方法,但这可能会产生不可接受的延迟。
在 IntelliFactory,我们现在正在开发一个项目,该项目需要服务器和客户端之间的异步双向和低延迟通信。我们最终使用了 WebSocket 协议。我们计划尽快将代码记录并发布到一个可重用的库中,供有类似需求的人使用。
就我们的目的而言,WebSocket 协议的主要优点是它允许在连接的服务器端维护状态。我们的服务器是在 Windows Azure 中运行的工作角色。服务器是在建立 WebSocket 连接时由 Azure 负载均衡器随机选择的,客户端在连接打开时与同一台服务器通信。这允许维护昂贵的初始化服务器上的每个连接状态。
WebSocket 协议的缺点是缺乏旧浏览器的支持。一种可移植的低延迟替代方案是 SignalR,它使用某种形式的 HTTP 轮询来模拟旧浏览器上的功能。不幸的是,到目前为止,我们未能使 SignalR 适应我们对 Azure 的要求。这在理论上应该是可能的,但由于 AFAIK SignalR 遵循几乎无状态的设计,因此需要编写一个路由器来重定向消息并“撤消”Azure 负载均衡器的效果。
我不知道 WebSharper 的集成点,但 Rx 有许多很好的概念和功能,用于功能性和反应性事件处理,如节流(需要滑块和异步网络调用)。
https://github.com/Reactive-Extensions/RxJS https://github.com/panesofglass/FSharp.Reactive