【问题标题】:Fastest way to send data from C# to javascript? [closed]将数据从 C# 发送到 javascript 的最快方法? [关闭]
【发布时间】:2021-07-04 22:31:59
【问题描述】:

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

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

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

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

【问题讨论】:

  • Websockets 应该做的
  • 浏览器有什么限制?这种设计至少可以说是非常规的!
  • 使用信号器连接。写入文本文件并从 js 读取似乎是一个糟糕的设计。
  • 将您的控制台应用程序编写为 Web api 应用程序,并使用 signalR 在数据发生变化时发送数据。为了获得最佳性能,请将差异发送到当前数据
  • 浏览器中的JS真的可以重复从本地磁盘读取一个文件,而不需要用户每次都选择吗?

标签: javascript c# send transfer


【解决方案1】:

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

Mozilla 有一个迷你教程似乎非常适合这项任务:Writing a WebSocket server in C#

回复:评论:

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

【讨论】:

  • 比 SignalR 更辛苦,它抽象了很多低级的东西
【解决方案2】:

您所说的“最快”是什么意思存在争议 - 您编写速度最快或应用程序性能最快。

将 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 以获取完整教程(它非常复杂,使用数据库和所有内容 - 您可以将其简化很多,甚至可能只是从 SPA 模板中创建一个 Web 应用程序项目 VS 将创建您需要的所有内容有前端JS和后端C#


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


最后有人评论了 SignalR - 一种来自 MS 的技术,它构建在 websocket 之上并处理连接管理,以及在任一端查找和调用代码。它有助于创建事件驱动的应用程序,其中事件发生在任一端(如聊天应用程序;一个人说话,它会导致浏览器中的 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 自主进行

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 否 - 您可以打开连接并使其保持打开状态,从而在没有连接延迟的情况下进行通信。我进行了编辑以澄清这一点。
    • 感谢回复,我应该创建一个新的 aspx 项目来应用它吗?还是没有必要?
    • 可能是一个 Web API 项目。有很多路要走 - 请参阅下面 Caius Jard 的回答。在您确定一个简单的 http 请求实际上不够快之前,我不会走 websockets 或 signalR 路径。保持简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2019-10-03
    • 2011-08-14
    • 2020-05-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    相关资源
    最近更新 更多