【问题标题】:SignalR hub not found after website is published网站发布后未找到 SignalR 集线器
【发布时间】:2020-10-12 02:03:02
【问题描述】:

我有一个 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");
    });
}

在我的 razor 页面中,我在脚本末尾添加以下内容:

<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 连接到“wss://myurl/MainHub”失败:WebSocket 握手期间出错:意外响应代码:404

HubManager.js:61 错误:传输出现错误。 在 WebSocket.webSocket.onerror (signalr.js:4728)

  • https://myurl/MyWebApp/Home/MyPage
  • https://myurl/MyWebApp/js/signalr/dist/browser/signalr.js
  • wss://myurl/MainHub

Websockets 协议安装在服务器上。那么问题可能是什么呢?

【问题讨论】:

  • 我想和你确认这些信息: 1) Razor 和 api 部分的路由是否可以在服务器上工作? 2)如果不限制客户端仅使用WebSockets 传输,它是否有效? 3)服务器日志中是否有任何有用的信息?
  • @FeiHan 1) 路由 api 工作,剃须刀仍然未知,因为我仍在构建应用程序 2) 客户端仅限于 websockets,如上所示 3) iis 服务器日志或信号器?

标签: c# asp.net-core signalr asp.net-core-signalr


【解决方案1】:

WebSocket 连接到“wss://myurl/MainHub”失败:WebSocket 握手期间出错:意外响应代码:404

如果我将 ASP.NET Core 应用程序作为 IIS 子应用程序“MyWebApp”托管,但未在 SignalR JavaScript 客户端使用子应用程序的路径库设置 URL,我可以重现相同的问题。

要使其与 IIS 子应用程序一起使用,您可以尝试如下修改代码,然后将其重新发布到您的 IIS 服务器。

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/MyWebApp/MainHub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .configureLogging(signalR.LogLevel.Information)
    .withAutomaticReconnect()
    .build();

【讨论】:

  • 我现在收到此错误:WebSocket 连接到 'wss://myUrl/MyWebApp/MainHub?id=rjBcaMyToBn0GsQ6j2ZXQA' 失败:WebSocket 握手期间出错:意外响应代码:200
  • 您可以尝试使用其他传输方式(如 LongPolling)进行配置,并检查是否可以工作。
猜你喜欢
  • 2013-10-14
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
相关资源
最近更新 更多