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

01

SignalR默认要协商传输方式

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

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

对应产生下图:

小技巧(嬉笑脸):如果你确定你的网络环境能稳定的走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请求

故你还需要在使用 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]  (无奈脸),但是标准的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], 已经成功合并,(兴奋脸),这是我首次向开源项目提PR且获得通过的项目。

04

部署生产,需要nginx支持

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

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

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

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

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

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

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

●实时通信技术大乱斗

●.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

快完了,号外号外:

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

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

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

SingnalR 开发到生产部署闭坑指南相关推荐

  1. Linkis生产部署服务器配置参考指南

    1.介绍 ​ Linkis已经在微众银行大数据生产平台稳定运行两年有余,开发运维人员总结出了一套Linkis生产部署的指南,以让Linkis在稳定运行的基础上发挥出它最大的性能,同时也能够节约服务器资 ...

  2. 《微软云计算Windows Azure开发与部署权威指南》——6.8 AppFabric服务总线的多播服务开发...

    本节书摘来自异步社区<微软云计算Windows Azure开发与部署权威指南>一书中的第6章,第6.8节,作者: 尹成 , 郝庭毅 , 张俊强 , 孙奉刚 , 寇睿明 更多章节内容可以访问 ...

  3. 金志文机器人歌叫什么_MIR发布《移动机器人部署安全指南》白皮书

    保障人身安全,提高作业效率一直都是行业所关注的问题. 文|编辑部 近期,MiR机器人中国区总监袁亿米(Emil Hauch Jensen)在接受媒体采访时表示,"今年在很多方面都是特殊的一年 ...

  4. 服务器部署基础知识_我在生产部署期间学到的知识

    服务器部署基础知识 by Shruti Tanwar 通过Shruti Tanwar 我在生产部署期间学到的知识 (What I learned during production deploymen ...

  5. 开发测试服务器配置信息,node服务端中台实现及开发测试生产环境配置

    本人node服务端新人一枚,网上找了不少资料,看了很多别人的配置信息,感觉都不是很合适,看的多了自己也明白配置的具体思路跟实现方式了,以下为我的实现方式.通过package.json里面的script ...

  6. 基于Kubernetes的Spark部署完全指南

    基于Kubernetes的Spark部署完全指南 [编者的话]本文是在Kubernets上搭建Spark集群的操作指南,同时提供了Spark测试任务及相关的测试数据,通过阅读本文,你可以实践从制作Sp ...

  7. CentOS 7.2下Filebeat+Kafka+ELK生产部署(安全加固)

    01架构说明 在需要采集日志的服务器上部署Filebeat服务,它将采集到的日志数据推送到Kafka集群: Logstash服务通过input插件读取Kafka集群对应主题的数据,期间可以使用filt ...

  8. 购买服务器及宝塔部署环境指南

    服务器购买宝塔部署环境指南 为什么程序员都需要一个自己的服务器 作为一个程序员,必须要发布自己的网站和项目 联系linux 自己的远程长裤,远程数据库,远程tomcat-搭建在服务器上 练习,Linu ...

  9. Oracle 11G 11.2.0.4 RAC部署参考指南

    Oracle 11G 11.2.0.4 RAC部署参考指南 一.Oracle 11g RAC部署 二.集群规划 三.主机网络规划 四.操作系统配置部分 五.Grid集群软件安装部分 六.Oracle ...

最新文章

  1. 洛谷P4480 【[BJWC2018]餐巾计划问题】
  2. python大数据搜索_python语言-用 Python 实现一个大数据搜索引擎
  3. 商品和服务税收分类编码表_如何设置客户编码和商品编码?(附操作图)
  4. [css] 请你解释下什么是浮动和它的工作原理是什么?同时浮动会引起什么问题?
  5. Hashtable的测试
  6. C 语言结构体引用,引用 C 语言结构体学习
  7. 转型个股赚钱机会最大--封起“345”选股
  8. MySQL要不要用函数_2.mysql函数的使用
  9. 数据库系统概论第五版(笔记+习题答案)(全)
  10. 服务器数码管不显示,LED数码管不亮的原因及故障排查方法
  11. 聊一聊在Airtest自动化中如何清除iOS后台应用
  12. FAT12文件系统基本格式
  13. 基于JAVA的ICQ系统的设计于实现
  14. 骑行318、 2016.7.23
  15. 石墨文档链接不到服务器,石墨文档怎么打开链接
  16. 让企业订单交期满足率提升3.5倍,新一代APS(高级生产计划与排程系统)是什么样的?
  17. 足球比赛数据可视分析
  18. [项目管理]-- 项目开发流程(基本流程)
  19. SLAM-Visual Navigation学习之SIFT算法与代码详解
  20. java 替换文件中的字符串

热门文章

  1. ASP.NET性能优化之构建自定义文件缓存
  2. oracle静默安装集群,静默安装Oracle数据库10g篇
  3. 黑马C++设计模式2
  4. Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)
  5. leetcode13
  6. Android 4.X 系统加载 so 失败的原因分析
  7. 【python】python中的定义类属性和对像属性
  8. StackExchange.Redis 使用 (一)
  9. WCF发布到IIS7问题的解决方案
  10. GChemPaint-绘制化学分子布局