gpt4 book ai didi

apache - "Unexpected token H in JSON at position 0"Apache Web 服务器上的 SignalR 核心和 Kestrel

转载 作者:行者123 更新时间:2023-12-04 19:10:13 24 4
gpt4 key购买 nike

我目前正在 Ubuntu 上运行 apache2 网络服务器。此 Web 服务器托管 Vue.js Web 应用程序,该应用程序使用 SignalR 连接到 .Net Core 应用程序(也在同一 linux 服务器上)以创建 websocket。

.Net Core 应用程序使用 Kestrel 运行。以下是将 domain.com/api 重新路由到在端口 5000 上运行的 .Net Core 应用程序的 apache 配置。

<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost _default_:443>
DocumentRoot /var/www/example.com/dist/spa
ServerName www.example.com
ServerAlias example.com

ProxyPreserveHost On
ProxyPass "/api" http://localhost:5000/
ProxyPassReverse "/api" http://localhost:5000/
RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /(.*) ws://localhost:5000/$1 [P]

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
SSLCertificateFile /etc/apache2/ssl/example_com.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/example_com.ca-bundle

ErrorLog ${APACHE_LOG_DIR}example-error.log
CustomLog ${APACHE_LOG_DIR}example.log common
</VirtualHost>

当 Vue.js 应用程序尝试创建到 example.com/api/mainHub 的 websocket 连接时,会发生以下错误:

Failed to complete negotiation with the server: SyntaxError: Unexpected token H in JSON at position 0



似乎将请求发送到正确的 URL, https://example.com/api/mainHub但无法建立连接。

我在 Linux 服务器上注意到的一件事是 POST 在路径中不包含/api。

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Request starting HTTP/1.1 POST http://example.com//mainHub/negotiate text/plain;charset=UTF-8 0



这是我的 apache2 配置如何将请求路由到/api 目录的问题吗?

编辑
我已经更改了我的 apache 配置以删除额外的 /在 localhost:5000 的末尾 - 这允许外部连接到达正确的 API 路径。
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost _default_:443>
DocumentRoot /var/www/example.com/dist/spa
ServerName www.example.com
ServerAlias example.com

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

ProxyPreserveHost On
ProxyPass "/api" http://localhost:5000
ProxyPassReverse "/api" http://localhost:5000

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
SSLCertificateFile /etc/apache2/ssl/example_com.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/example_com.ca-bundle

ErrorLog ${APACHE_LOG_DIR}example-error.log
CustomLog ${APACHE_LOG_DIR}example.log common
</VirtualHost>

现在的问题似乎与安全 websocket 升级有关。我尝试将 ws 升级更改为 wss,但仍然有问题。当客户端尝试建立 wss 连接时,会出现以下错误:

WebSocket connection to 'wss://example.com/api/mainHub?id=k1-_KxspgAQgIAhKroQBpQ' failed: Error during WebSocket handshake: Unexpected response code: 502



我认为我的虚拟主机使用 HTTPS 升级 websocket 连接的方式有问题。

Error: Failed to start the transport 'WebSockets': null

最佳答案

如果您的 .Net Core 应用程序正在收听 /api/在端口 5000 上,然后将其添加到 ProxyPass 指令中:

ProxyPass "/api" http://localhost:5000/api
ProxyPassReverse "/api" http://localhost:5000/api

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

ProxyPreserveHost On
ProxyPass "/api" http://localhost:5000
ProxyPassReverse "/api" http://localhost:5000

关于apache - "Unexpected token H in JSON at position 0"Apache Web 服务器上的 SignalR 核心和 Kestrel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57551748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com