SingnalR 开发到生产部署闭坑指南

8a20c7d4109337f88c454ea3a8d1fe9c.gif

前天倒腾了一份[SignalR在react/go技术栈的实践

01

SignalR默认要协商传输方式

SignalR 默认要求协商传输方式[1]

不管是.NET客户端还是JavaScript客户端,构建连接时都存在一个默认配置:SkipNegotiation=fasle,负负得正就等于要求协商,这个默认配置的完整含义是 建立SignalR连接时,客户端要求协商传输方式

对应产生下图:

90991ce6520b7670d1d893d3dc852b72.png小技巧(嬉笑脸0269beca40873a54a56f28903f1508b2.png):如果你确定你的网络环境能稳定的走websocket传输, 为了快速建立实时通信,可跳过协商请求(设置SkipNegotiation=true), 毕竟每次刷新页面,react组价都会重新加载,重新协商再传输 费时费力。
const connection = new HubConnectionBuilder().withUrl(process.env.REACT_APP_APIBASEURL+"realtime", {skipNegotiation: true,  transport: HttpTransportType.WebSockets}).withAutomaticReconnect().withHubProtocol(new JsonHubProtocol()).configureLogging(LogLevel.Information).build();

注意:SkipNegotiation=true,仅限于客户端的传输方式指定为 websocket, 其他方式均会报错。

02

SignalR传输协商是fetch请求

     跟ajax一样,fetch请求[2]也是浏览器脚本的一种,所以很明显也会涉及跨域,标准的CORS方案依然对其有效。

http://localhost:9598/realtime/negotiate?negotiateVersion=1
Post请求
有自定义的请求头 X-Requested-With, X-Signalr-User-Agent

很明显,这又会触发预检Option请求

8de4661d10b7b1842e515ba95a08713f.png

故你还需要在使用 CORS Middleware时允许这几个自定义请求头。

// 下面是Go github.com/rs/cors package 支持CORS的代码c := cors.New(cors.Options{// AllowedOrigins:   []string{"http://localhost:3000","http://rosenbridge.17usoft.com"},AllowOriginFunc: func(origin string) bool {return true},AllowedMethods:   []string{"POST", "GET", "OPTIONS", "PUT", "DELETE"},  // 下面要加上signalr传输协商要用到的自定义请求头AllowedHeaders:   []string{"Content-Type", "x-requested-with", "x-signalr-user-agent"},AllowCredentials: true,Debug:            cfg.Log.Debug,})

03

WebSocket请求也有同源限制

ws://localhost:9598/realtime?id=aoSD_WZhqbRfPyXVTYsHig==

WebSocket也有同源限制[3]  (无奈脸3275c5e19779e7043bf5b1c5e9f7d296.png),但是标准的CORS对其无效,因为CORS解决是HTTP脚本请求的跨域问题,WebSocket说到底不算http协议。

浏览器依旧会为我们携带Origin标头,所以服务端需要验证这些标头,确保只允许来自预期来源的WebSocket。

// 以下是.NET Core 针对websocket同源限制做出的跨域配置var webSocketOptions = new WebSocketOptions()
{KeepAliveInterval = TimeSpan.FromSeconds(120),
};
webSocketOptions.AllowedOrigins.Add("https://client.com");
webSocketOptions.AllowedOrigins.Add("https://www.client.com");app.UseWebSockets(webSocketOptions);

btw, 我使用的GO SignalR库不支持WebSocket跨域, 我提了一个PR[4], 已经成功合并,(兴奋脸d7ea6d11ad1f200af448336ebf6562f7.png),这是我首次向开源项目提PR且获得通过的项目。

04

部署生产,需要nginx支持

按照默认配置,一般会先协商,再使用websocket传输。

部署到生产之后,协商后优先使用WebSocket模式, 但是传输失败了, 自动切换为服务器发送事件SSE模式,传输成功。

00e0c26582dbbc48325dc20e2d7ac62d.png

浏览器开发者工具看不出啥端倪, 使用Fiddler抓包发现 400 状态码

5414bdc5520dc6f22069b8c1a71a8618.png

网上搜索了一下,可能是生产的nginx不识别websocket标头。在nginx配置里面添加如下配置就可以了。

location / {proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;                proxy_set_header Connection "upgrade";    
}

以上是马甲哥整理的SignalR从开发到部署的闭坑指南,因为微信公众号内容发布后不方便重新编辑,后续有更多闭坑技能,会同步到大家喜闻乐见的博客园马甲哥[5]

5fbceccb1788e007e4c2b6f926b4b222.gif

还没完, 因为本文是零散的闭坑指南, 文中点出的坑位其实都有相关技能点,感兴趣的童靴可以认真阅读下面给出的相关推荐(真诚脸928e6f32e75f4d32cf7397f32377e12c.png

●实时通信技术大乱斗

●.NET WebSocket 核心原理初体验

●.NET gRPC核心功能初体验

● SignalR在React/Go技术栈的实践

● 对CORS OPTIONS预检请求的一些思考

● 程序员应对浏览器同源策略的姿势

引用链接

[1] SignalR 默认先协商: https://docs.microsoft.com/en-us/aspnet/core/signalr/configuration?view=aspnetcore-5.0&tabs=dotnet
[2] fetch请求: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
[3] WebSocket也有同源限制: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets?view=aspnetcore-5.0
[4] PR: https://github.com/philippseith/signalr/pull/75
[5] 博客园马甲哥: https://www.cnblogs.com/JulianHuang/p/15434137.html

d04756829452dc32c6743e802a27d144.gif

快完了,号外号外:

  1. 本文内容和制图均为原创,文章永久更新地址请参阅左下角原文,如对您有所帮助,请一键三连,激浊扬清,方便的话置一个星标 ~。。~。

  2. 关注本号,后台回复【pdf】,送你号主征战多年的经典技术PDF:大前端、.net、Go、云原生、数据库,童嫂无欺,回复【码甲哥】,加我好友。 

  3. 关注本公众号的5000+筒靴们应该都知道,本号一直不遗余力的输出原创技术、职场心得,内容说不上什么耳目一新、醍醐灌顶,但号主的技能点一直在进化,本次建立了一个[码甲哥高质量交流群],希望能和童鞋面对面成长(真诚脸7bd4a68ba1380a9ac83a6383e125c79d.png)。

586b4a62c38ff65cfcd1d1f11da1555b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DB2 pureScale在线备份恢复实例1

刚刚接触DB2,对DB2的备份恢复机制不是太熟悉,相关的资料又太少,只好自己慢慢摸索了。 需求 对生产库进行在线压缩备份,备份中包含归档日志,定期将生产库备份恢复到测试环境,确保测试环境采用最新的生产数据…

华为服务器参数配置文件,最实用的华为配置基础手册.doc

经过Console 口登录应用环境用户需要经过Console 口登录到S-switch,图1-1 所表示。图1-1 经过Console 口登录到S-switch说明假如S-switch 是第一次上电,而且用户需要管理和配置S-switch,则用户只能经过Console 口登录到S-switch。背景信息在经…

Hibernate统计表中的条数

/** * 判断积分日志表中是否有某个用户的注册日志 */Transactional(propagation Propagation.REQUIRED)public boolean isExistRegPointLog(int userId, UserAction addReg) { try { String hql "select count(pl) from PointLog pl WHERE pl.…

SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践

SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践前言:自从上一篇文章发出之后,收到了很朋友的关注。很多朋友要求多多实践,而不是纯粹的理论。确实,从打算出这个系列开始,我就本着实践的思想来进行的&#xff01…

超炫物理动态图!收藏吧,吓死宝宝了...

全世界只有3.14 % 的人关注了爆炸吧知识让我们玩的有水平、有姿势,在玩儿的时候产生好奇心,下面20个简单实用的科学小游戏是不错的选择哟。友情提示:部分实验有危险,请在专业人士指导下谨慎操作~1.防火气球水能将火的热能吸收&…

promtail 配置详解_基于loki+promtail+grafana技术的日志集合

一、背景和动机近期运维工作中,随着项目的不停优化以及上线。在与后端、测试协同工作的交流中发现,为了测试以及解决项目在上线过程中或者试运行中出现的bug报错问题,开发同事对于日志的分析有着很大的需求。但是现在公司的日志查看主要是给予…

《Redis核心技术与实战》学习总结(2)

【Redis】| 总结/Edison Zhou1上一篇的遗留问题上一篇总结了一个KV数据库的基本架构 和 Redis的底层数据结构概览,重点总结了Sorted Set的两个数据结构的切换,但没有介绍List的两个数据结构的切换,因此本文试着总结一下。这里先直接给出答案&…

【转】sqlserver游标概念与实例全面解说

引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子: 表一 OriginSalary 表二 AddSalary 现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工…

洛谷2296 寻找道路

题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通。 2 .在满足…

奇迹mu选区后就一直显示连接服务器,奇迹mu双开

《奇迹mu》双开方法 EX702双开的方法,今天小编为大家带来了奇迹MU双开方法,为大家解决一些双开中的问题,下面就一起来看看EX702双开的问题吧!奇迹mu双开:接下来是这样:1、 复制2个客户端,放在不…

第十一章:【UCHome二次开发】功能修改

有些功能的修改涉及到了流程或数据需求的变动,这时候简单的修改模板文件已经无法解决问题,而是需要修改对应的流程和数据处理代码来完成。一般处理程序文件位于/source文件夹下。具体的代码修改就是根据功能逻辑来调整php代码或是sql语句,这里…

华为鸿蒙OS 2.0正式发布!明年华为手机将全面支持!

全世界只有3.14 % 的人关注了爆炸吧知识9 月 10 日,在华为开发者大会 2020 上,华为消费者业务 CEO 余承东宣布推出鸿蒙 OS 2.0 版本(HarmonyOS 2.0)。鸿蒙 OS 的代码也在今天下午HDC 2020 大会结束后的 18:18 正式开放。鸿蒙 OS 开…

echo字符集 shell_Xshell 能显示中文 但输入的中文都变成了问号

我的Xshell 本来可以输入中文,但是不知道怎么的输入中文却变成问号了解决方法:点击控制面板,然后将除自己使用的中文输入之外的其他语言、输入法等先全部删除,然后再试一下,如果可以输入中文了,可适当添加一…

微软认真聆听了开源 .NET 开发社区的炮轰: 通过CLI 支持 Hot Reload 功能

微软近日激怒了开源.NET社区,起因是它删除了开源.NET的一项旗舰功能,以提升Visual Studio 的吸引力,尤其是针对与Visual Studio颇有渊源的跨平台源代码编辑器Visual Studio Code。好消息是微软听取了社区的声音,恢复了通过CLI支持…

System.Xml名称空间下的支持DOM的类型

最主要的常用的类型 XmlNode 是DOM结构中的所有类型的基础类型,它定义了所有XML节点的通用属性和方法,是XMLDOM的基础。它具有一个ChildNodes属性,表示它所包含的子XML节点。 XmlAttribute 表示XML属性,它只保存在XmlElement的Att…

烽火服务器查询服务器型号,烽火服务器应该起的进程

烽火服务器应该起的进程 内容精选换一换IDE Daemon模块提供接口给Matrix和Framework调用,Matrix通过这些接口可以实现将DVPP预处理结果数据发送到IDE-daemon-hiai进程所在的服务器,IDE-daemon-hiai将结果数据写到文件中;Framework通过调用这些…

(译)元素浮动的那些事儿

原文:http://bitsofco.de/2015/how-floating-works/,作者 Ire Aderinokun 发表于 2015 年 8 月 11 日。 尽管我们现在用浮动布局已经很少了,但是在一些特殊的需求下,它仍然是唯一可行的解决方案。在这些少见的需求中,浮…

session机制和cookie机制

一、cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要…

无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法

一、ABBTZID-C 智能定位器安装及操作气路连接使用与定位器气源端口处标识的标准接口连接气源连接定位器的输出与气动执行器的气缸电气连接根据下列接线端子图以及设计要求进行相应的配线(一般只需11,-12,31,-32)11-12控制信号输入端子(DC4---…

这个黑科技小音箱,不用连蓝牙、一触即播

▲ 点击查看以前用蓝牙音箱,都要打开蓝牙找半天,有时还找不到对应的音箱。找到了,连接又很 …… 漫长 ……一句「请等待蓝牙配对」重复好几遍还没连上,整个人都不好了。而今天介绍的这个开物灵犀感应音箱,不用连蓝牙&a…