websocket Cyberpanel上托管的Asp Net SignalR错误

yzxexxkh  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(255)

我正在创建一个农场管理网站。我在CyberPanel上运行一个ASP Net Web API。我是按照这篇文章做的:Publish & Run ASP.Net on CyberPanel / Linux – Blog of Viov
问题是我用的是一种叫SignalR的技术。SignalR基本上是一个顶级抽象层,用于简化Web Socket(它还包括其他功能,但现在不重要)。在开发环境中,一切都按预期进行,但当我在Cyberpanel上部署应用程序并托管AspNet时,Web Socket停止工作。
Cyberpanel错误日志将打印以下内容:

[2023-05-24 09:26:32.085918 [INFO] [18351] [187.74.137.142:46278#api.milksolve.com.br]找不到Web Socket后端。URI:[/fazendahub]

客户端说WebSocket没有发送握手,所以Websocket肯定没有工作。我检查了访问日志,在那里我确认了Signalr协议在Web Socket连接上中断。有人有解决办法吗?
编辑:
经过一些研究,我发现这个问题与虚拟主机反向代理有关。CyberPanel使用OpenLiteSpeed,我在互联网上找到的唯一解决方案是Ngix和Apache。
我的重写文件:

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]

不支持WebSocket

5jvtdoz2

5jvtdoz21#

经过几天的痛苦,我找到了自己的解决办法。第一件事是设置一个反向代理,如本文所述:Publish & Run ASP.Net on CyberPanel / Linux – Blog of Viov
之后,您将代理上下文更改为:

这里唯一的区别是您需要在标题操作中添加此行:

RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}

更改后,您将需要创建一个WebSocket代理。OpenLiteSpeed有自己的标签:

在这里,你只需要创建一个WebSocket代理,但有两件重要的事情:

  1. URI必须是斜杠:/
    1.地址必须为localhost:port。只有当您更改了launchsettings.json文件时,它才会更改。默认为localhost:5000
    创建后,您将需要添加一些重写规则,如果您使用CyberPanel,这应该在其网站管理区域完成。如果你没有,你只需要去OpenLiteSpeed上的重写区域(我会在Cyberpanel上展示)。
    重写规则应该是这样的:

RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*)           ws://[External App Name]/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*)           http://[External App Name]/$1 [P,L]

重要

您可以将[External App Name]更改为在反向代理创建期间定义的外部应用程序名称,以查看您将在OpenLiteSpeed上转到此屏幕的名称:

在这里,您可以看到外部应用程序的名称。完成所有这些之后,您应该刷新OpenLiteSpeed并重新启动Asp Net Service。这应该能解决你的问题

相关问题