将数据从 C# 发送到 javascript 的最快方法?

问题描述

我有两个独立的应用程序。其中一个是纯JS编写的UI web应用,另一个是C#编写的控制台应用。

目前我正在使用 C# 控制台应用程序计算一些变量(由于浏览器限制,无法在 JS 中完成),然后将结果写入 txt 文件

然后我用 JS 应用程序读取文件以将结果带到 UI。但该变量通常以毫秒为单位发生变化,将结果写入磁盘并再次检索它的速度非常慢。

我能做什么?有什么建议吗?

解决方法

控制台应用程序实际上是一个服务器。通过本地文本文件在 Web 应用程序和服务器之间进行通信是非常规的!如果这不仅仅是你自己在一台机器上使用,那么部署给另一个用户将是非常困难的。编写一个小型服务器应用程序并以通常的方式与其通信,即将数据发布到服务器的 IP 地址并接收服务器的响应。您可以通过 websocket 通信来消除任何连接延迟(在初始连接之后)。

,

正如其他人指出的,WebSockets 似乎是完成这项任务的绝佳选择。

Mozilla 有一个看起来非常适合此任务的迷你教程:Writing a WebSocket server in C#

回复:评论:

好点! SignalR 还有一个 MSFT 指南:Tutorial: Get started with ASP.NET Core SignalR

,

关于“最快”是什么意思 - 编写速度最快或应用性能最快..

将 C# 代码转换为 API 相对简单——visual studio 为 API 类型的项目提供模板;然后您的逻辑将获得一个 url,并且可以通过在任何浏览器中访问它或让 JavaScript 获取该 url 来触发。 url 本身可用于传递变量数据,C# 知道如何解析它并将其呈现在代码中,因此像(为清晰起见,删除了属性等)之类的方法

public class CalcController:ApiController{
  public int Add(int a,int b){
    return a+ b;
  }
}

可以通过访问 `http://host/api/add/1/2 的 url 来触发,你会得到 JSON,这是 JS 开箱即用的理解。如果您的 Web 应用程序为您的 js 提供服务,则 js 可以自动与 Web 应用程序对话,而无需任何 CORS 等,因为它是由同一台服务器提供的

请参阅 https://docs.microsoft.com/en-us/aspnet/core/tutorials/web-api-javascript?view=aspnetcore-5.0 以获取完整教程(它非常复杂,使用数据库和所有内容 - 您可以将其归结得更简单,甚至可能只是从 vs 中的 SPA 模板制作一个 Web 应用程序项目将创建您需要的所有内容需要前端JS和后端C#


另一个要考虑的选项是 Blazor;如果需要,您可以完全转储 JS 并将 c# 放在浏览器中(或将 c# 留在服务器上,让 Blazor 处理在客户端和服务器之间传输 UI 更改),或者您可以与 JS 进行互操作


终于有人评论了 SignalR——MS 的一项技术,它构建在 websockets 之上并处理连接管理,并在任一端查找和调用代码。它有助于创建事件驱动的应用程序,其中事件发生在任一端(如聊天应用程序;一个人说话,它会导致浏览器中的 JS 调用服务器上的方法并将他们键入的内容传输到服务器,然后服务器推送该应用程序)向一组其他连接的客户端发送消息)。你在你的 JS 中设置事件,比如“onChatReceived”,所以当服务器推送数据时,你响应它。 SignalR 自动处理防火墙;它要么使用 websockets(长寿命的双向数据流),长轮询(发出请求,服务器在它可以发送的消息之前不回答)或自动重复轮询(任何更新?任何更新?任何更新?),所以它可以使您的应用程序非常便携,特别是如果有一天您想在您控制的服务器上托管您的计算,以保护您的知识产权

关于 SignalR 的完整 MS 教程在这里 - https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-5.0&tabs=visual-studio - 您实际上是在设置一组事件机制;你的 JS 可以触发你的服务器做某事,然后你的服务器可以触发你的 JS 做某事。

这与您的 JS 请求您的服务器做某事并等待响应略有不同 - 该模型可能工作正常并且更容易实现,因为它最接近您已有的模型,您只需更换网络调用的文件读取,允许JS自主进行