stevenjin 2024-03-08 23:27 采纳率: 97.6%
浏览 4
已结题

怎样避免asp.net core mvc模板页的websocket重复调用

一、环境:
1.asp.net core mvc
2.项目每个视图引用了layout
3.websocket放在layout的脚本的窗体加载事件中
二、问题描述:由于登陆视图套用了layout模板页,每次登陆时,会调用一次window.onload事件中的websocket。导致每登陆或页面刷新时socket连接断开,后台SendWebsocketMsg方法报错
三、websocket应用怎样放,才不会被反复加载调用

  • 写回答

4条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-03-08 23:28
    关注

    stevenjin 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    为了解决这个问题,避免在每次页面加载时都重新创建WebSocket连接,您可以采取以下策略:

    1. 单例模式:确保在整个应用程序中只创建一个WebSocket实例。您可以在一个单独的JavaScript模块中初始化WebSocket,并通过模块导出这个实例。这样,在layout模板或其他任何视图中只需引用这个实例,而不是重复创建新的连接。
    // webSocketSingleton.js
    let instance = null;
    
    class WebSocketSingleton {
      constructor(url) {
        if (!instance) {
          this.socket = new WebSocket(url);
          // 添加其他必要的事件监听器(如open、close、message等)
          instance = this;
        }
        return instance;
      }
    
      send(data) {
        if (this.socket.readyState === WebSocket.OPEN) {
          this.socket.send(JSON.stringify(data));
        } else {
          console.error('WebSocket is not open for sending data.');
        }
      }
    }
    
    export default WebSocketSingleton;
    

    然后在layout的脚本中引入并使用此单例:

    // layout.cshtml 或 其他JS文件
    import WebSocketSingleton from './webSocketSingleton';
    
    window.onload = function() {
      const socket = new WebSocketSingleton('your-websocket-url');
      
      // 其他初始化逻辑...
    };
    
    1. 按需连接:仅在需要时才打开WebSocket连接,例如在用户登录成功后或进入特定页面时。当用户离开相关页面或注销账户时,关闭WebSocket连接。

    2. 添加额外检查:在调用onload事件中的WebSocket初始化函数前,先检查当前是否已有活跃的WebSocket连接,避免重复连接。

    以上方法可以有效防止WebSocket重复调用和不必要的连接断开问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 修改了问题 3月8日
  • 创建了问题 3月8日

悬赏问题

  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入