首页 > 其他分享 >记一下在IIS中部署WebSocket服务的经验

记一下在IIS中部署WebSocket服务的经验

时间:2023-12-26 15:35:51浏览次数:41  
标签:WebSocket IIS 部署 端口 System using webSocket

因业务需求需要使用长连接推送数据,这边选择使用.NET框架原生支持的WebSocket技术。

 

一、版本要求

  1.  对于IIS的版本必须是 IIS 8.0 及以上
  2.  .NET Framework版本必须为 4.5 及以上

PS:低于上述版本,需要自己实现协议或寻找第三方实现

 

二、IIS配置

  1. 在服务器IIS上安装“WebSocket 协议”服务,参考微软官方教程
  2. 在Web站点中的站点配置里启用Websocket支持,参考教程
    1. 选择一个站点或应用程序
    2. 找到配置编辑器
    3. 选择节点system.webServer/webSocket
    4. 设置enabledtrue

 

三、测试代码

参考于《WebSocket在Asp.Net中的例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.WebSockets;

namespace SimpleWebSocket
{
    /// <summary>
    /// 
    /// </summary>
    public class WebSocketHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //检查 查询是否是WebSocket请求
            if (HttpContext.Current.IsWebSocketRequest)  
            {
                //如果是,我们附加异步处理程序
                context.AcceptWebSocketRequest(WebSocketRequestHandler);
            }
        }

        public bool IsReusable { get { return false; } }

        //异步请求处理程序
        public async Task WebSocketRequestHandler(AspNetWebSocketContext webSocketContext)
        {
            //获取当前的WebSocket对象
            WebSocket webSocket = webSocketContext.WebSocket;

            /*
             * 我们定义一个常数,它将表示接收到的数据的大小。 它是由我们建立的,我们可以设定任何值。 我们知道在这种情况下,发送的数据的大小非常小。
            */
            const int maxMessageSize = 1024;

            //received bits的缓冲区
            var receivedDataBuffer = new ArraySegment<Byte>(new Byte[maxMessageSize]);

            var cancellationToken = new CancellationToken();

            //检查WebSocket状态
            while (webSocket.State == WebSocketState.Open)
            {
                //读取数据 
                WebSocketReceiveResult webSocketReceiveResult = await webSocket.ReceiveAsync(receivedDataBuffer, cancellationToken);

                //如果输入帧为取消帧,发送close命令
                if (webSocketReceiveResult.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, String.Empty, cancellationToken);
                }
                else
                {
                        byte[] payloadData = receivedDataBuffer.Array.Where(b => b != 0).ToArray();

                        //因为我们知道这是一个字符串,我们转换它
                        string receiveString = System.Text.Encoding.UTF8.GetString(payloadData, 0, payloadData.Length);

                        //将字符串转换为字节数组. 
                        var newString = String.Format("Hello, " + receiveString + " ! Time {0}", DateTime.Now.ToString());
                        Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(newString);

                        //发回数据
                        await webSocket.SendAsync(new ArraySegment<byte>(bytes), WebSocketMessageType.Text, true, cancellationToken);
                }

            }
        }
    }

}

 

四、项目配置

在项目的Web.config文件里确保如下配置正确:

<configuration>
  <system.web>
    <httpRuntime targetFramework="4.5" />
  </system.web>
</configuration>

主要是“<httpRuntime targetFramework="4.5" />”这行配置,一定要4.5及以上版本。

PS:如果有 httpRuntime 这个节点了,则加上 targetFramework="4.5" 即可

然后将项目部署到IIS上

 

其他问题

一、配置都没问题,本地测试也没问题,但线上WebSocket就是连不上,且无任何报错,仿佛被什么拦截了

检查一下IIS里部署的目标站点其开放的端口,是否只开放了443端口,即https。此时用wss协议连接试试,如“wss://127.0.0.1/test.ashx”

PS:因为网站出于安全考虑,一般不使用未加密的http协议,即80端口。而ws协议连接的正是80端口,就被拦截了。使用wss协议会连接443端口,就正常了。

标签:WebSocket,IIS,部署,端口,System,using,webSocket
From: https://www.cnblogs.com/zhangyuqi/p/17928094.html

相关文章

  • Nginx安装部署
    如果没有gcc环境,需要安装gcc:yuminstallgcc-c++安装依赖yum-yinstallgcczlibzlib-develpcre-developensslopenssl-devel#进入文件夹cd/usr/local#下载安装包wgethttp://nginx.org/download/nginx-1.18.0.tar.gz#解压安装包tar-xvfnginx-1.18.0.tar.g......
  • 开源对象存储Minio部署篇
    简介: MinIO是一个基于ApacheLicensev2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。(摘自minio中文站点https://docs.m......
  • 使用kubeadm在Centos8上部署kubernetes1.18
    //查看系统版本cat/etc/centos-releaseCentOSLinuxrelease8.1.1911(Core)//如果系统环境为8.0(云服务器默认最大安装环境为8.0)使用如下命令进行升级操作sudodnfupdate-y//配置网络cat/etc/sysconfig/network-scripts/ifcfg-enp0s3//添加阿里源rm-rfv/etc/......
  • minio集群的部署【nginx+minio]
    1、配置MinIO集群配置本地解析在/etc/hosts中配置vim/etc/hosts#添加以下内容,每台MinIO节点都需要配置192.168.5.1minio-1192.168.5.2minio-2192.168.5.3minio-3192.168.5.4minio-4 在4台服务器上创建MinIO存储文件夹mkdir-p/data/miniochmod750/data/minio......
  • FW/IDS/IPS/WAF等安全设备部署方式
    现在市场上的主流网络安全产品可以分为以下几个大类:1.基础防火墙FW/NGFW类 主要是可实现基本包过滤策略的防火墙,这类是有硬件处理、软件处理等,其主要功能实现是限制对IP:port的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。FW可以拦截低层攻击行......
  • 鸿蒙开发入门:多HAP的开发调试与发布部署流程
    多HAP的开发调试与发布部署流程多HAP的开发调试与发布部署流程如下图所示。图1多HAP的开发调试与发布部署流程开发开发者通过DevEcoStudio工具按照业务的需要创建多个Module,在相应的Module中完成自身业务的开发。调试通过DevEcoStudio编译打包,生成单个或者多个HAP,即可基于HAP进......
  • Presto、Trino 部署
    1.介绍1.1背景2020年12月27日,prestosql与facebook正式分裂,并改名为trino。Fackbook:https://prestosql.io/初创团队:https://trino.ioPresto是一个facebook开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节。Presto的架构由关系型数......
  • iis 部署SSL 出现的问题
    自从服务器上部署SSL后,总是出现从远程客户端应用程序收到一个 TLS1.2连接请求,但没有任何受客户端应用程序支持的密码套件是受服务器支持的。SSL连接请求失败的错误。IISCrypto软件是一款专门为电脑服务器打造的智能管理工具,使管理员能够在WindowsServer2008、2012和......
  • Oracle-19c图形化界面安装部署
    ---Oracle数据库图形化界面安装,可以用linux桌面版来安装,也可以用linux命令行界面安装,不过需要Xmanager辅助图形化安装1、安装前期准备:#关闭防火墙,并关闭防火墙开机自启动systemctlstopfirewalldsystemctldisablefirewalld#检查防火墙状态systemctlstatusfirewalld#关闭......
  • k8s 部署 kuboard v3
    下载kuboard部署清单#wgethttps://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml修改部署清单configmap#vimkuboard-v3-swr.yaml修改内容#KUBOARD_AGENT_KEY是Agent与Kuboard通信时的密钥,请修改为一个任意的包含字母、数字的32位字符串,此密钥变更后,需要删除K......