网站发布后找不到 SignalR 集线器
SignalR hub not found after website is published
我有一个 ASP.Net Core 3.1 WebApp,其中包括 Razor Pages、Api 控制器和一个 SignalR 集线器。我的 Startup.cs
看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddRazorPages();
services.AddSignalR(options =>
{
options.EnableDetailedErrors = true;
});
services.AddMvc();
services.AddSingleton<HubManager>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapHub<MainHub>("/MainHub");
});
}
在我的剃须刀页面中,我在脚本末尾添加了以下内容:
<script src="~/js/signalr//dist//browser/signalr.js"></script>
<script src="~/js/HubManager.js"></script>
HubManager.js
看起来像这样:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/MainHub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.withAutomaticReconnect()
.build();
async function start() {
try {
await connection.start();
console.log("connected");
} catch (err) {
console.log(err);
setTimeout(() => start(), 5000);
}
};
connection.onclose(async () => {
await start();
});
start();
然后我发布 web 应用程序并导航到使用 SignalR 的页面(使用 Chrome)。但是当我检查控制台时,我看到 SignalR 每 1 秒轮询一次,并且这个错误一直显示:
signalr.js:4709 WebSocket connection to 'wss://myurl/MainHub' failed: Error during WebSocket handshake: Unexpected response code: 404
HubManager.js:61 Error: There was an error with the transport.
at WebSocket.webSocket.onerror (signalr.js:4728)
- https:///myurl/MyWebApp/Home/MyPage
- https:///myurl/MyWebApp/js/signalr/dist/browser/signalr.js
- wss://myurl/MainHub
服务器上安装了 Websockets 协议。那么问题是什么?
WebSocket connection to 'wss://myurl/MainHub' failed: Error during WebSocket handshake: Unexpected response code: 404
如果我将 ASP.NET 核心应用程序托管为 IIS 子应用程序“MyWebApp”但未在 SignalR [=20] 上设置 URL 子应用程序的路径库,我可以重现同样的问题=]客户端。
要使其与 IIS 子应用程序一起使用,您可以尝试如下修改代码,然后将其重新发布到您的 IIS 服务器。
const connection = new signalR.HubConnectionBuilder()
.withUrl("/MyWebApp/MainHub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.withAutomaticReconnect()
.build();
我有一个 ASP.Net Core 3.1 WebApp,其中包括 Razor Pages、Api 控制器和一个 SignalR 集线器。我的 Startup.cs
看起来像这样:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddRazorPages();
services.AddSignalR(options =>
{
options.EnableDetailedErrors = true;
});
services.AddMvc();
services.AddSingleton<HubManager>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapHub<MainHub>("/MainHub");
});
}
在我的剃须刀页面中,我在脚本末尾添加了以下内容:
<script src="~/js/signalr//dist//browser/signalr.js"></script>
<script src="~/js/HubManager.js"></script>
HubManager.js
看起来像这样:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/MainHub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.withAutomaticReconnect()
.build();
async function start() {
try {
await connection.start();
console.log("connected");
} catch (err) {
console.log(err);
setTimeout(() => start(), 5000);
}
};
connection.onclose(async () => {
await start();
});
start();
然后我发布 web 应用程序并导航到使用 SignalR 的页面(使用 Chrome)。但是当我检查控制台时,我看到 SignalR 每 1 秒轮询一次,并且这个错误一直显示:
signalr.js:4709 WebSocket connection to 'wss://myurl/MainHub' failed: Error during WebSocket handshake: Unexpected response code: 404
HubManager.js:61 Error: There was an error with the transport. at WebSocket.webSocket.onerror (signalr.js:4728)
- https:///myurl/MyWebApp/Home/MyPage
- https:///myurl/MyWebApp/js/signalr/dist/browser/signalr.js
- wss://myurl/MainHub
服务器上安装了 Websockets 协议。那么问题是什么?
WebSocket connection to 'wss://myurl/MainHub' failed: Error during WebSocket handshake: Unexpected response code: 404
如果我将 ASP.NET 核心应用程序托管为 IIS 子应用程序“MyWebApp”但未在 SignalR [=20] 上设置 URL 子应用程序的路径库,我可以重现同样的问题=]客户端。
要使其与 IIS 子应用程序一起使用,您可以尝试如下修改代码,然后将其重新发布到您的 IIS 服务器。
const connection = new signalR.HubConnectionBuilder()
.withUrl("/MyWebApp/MainHub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.configureLogging(signalR.LogLevel.Information)
.withAutomaticReconnect()
.build();