SignalR协商404错误

26
我正在使用SignalR 2.0。在本地运行VS 2012时一切正常。但是将网站发布到IIS上后,它就出现问题。站点可以加载,但其中一个脚本返回404未找到错误。该脚本类似于以下内容。

https://example.com/signalr/negotiate?xxx

事实上,此路径不存在。正确的路径应该是:

https://example.com /private / signalr / negotiate?xxx

请注意粗体部分。
在WebSite( https://example.com/ )内,我有另一个应用程序( https://example.com/private/ )。 这个应用程序正在使用SignalR。
由于signalr/hubs路径可以从我的私人站点访问,所以这似乎是SignalR的一个错误。

1
你解决了吗?我也遇到了同样的问题... - Dunken
@Dunken 我已经解决了这个问题。请查看我的答案并检查是否适用于您。 - styfle
8个回答

22

我遇到了类似的问题。 这里是配置/signalr URL的文档。

然而,我的解决方案与文档不同。 我没有改变标准的app.MapSignalR(),而是改变了客户端代码以使用/MyApp/signalr。这里是代码,“MyApp”是我的Web应用程序的虚拟目录。

        var connection = $.hubConnection('/MyApp/signalr', {useDefaultPath: false});
        var changesHub = connection.createHubProxy('changesHub');

        changesHub.on('userCountChanged', function (count) {
            $('#user-count').text(count);
        });

        connection.start().done(function () {
            console.log('Hub has started');
            changesHub.invoke('subscribeToChanges', user.id);
        });
我试过另一种方法(将MapSignalR更改为/signalr路径),但这并没有起作用,协商仍然被路由到/MyApp/signalr/negotiate。

我尝试了另一种方式(将MapSignalR更改为/signalr路径),但是它并没有奏效,协商仍然被路由到/MyApp/signalr/negotiate。


9
我曾遇到同样的问题,我的应用程序在IIS默认Web站点中运行。 所有微软的示例都显示带有起始字符\的hub URL,而我复制了这些示例。但这意味着signalr路由来自于默认的Web站点而不是应用程序。去掉前面的\就解决了这个问题。
因此,我在Startup.cs中使用了端点(endpoint),如下所示:
endpoints.MapHub<MyHub>("myHub");

像JavaScript中的“and”和“hub”连接一样:

var connection = new signalR.HubConnectionBuilder().withUrl("myHub").build();

1
谢谢,这就是我的问题 - .NET Core 3。 - Boyardee

3

当使用signalr的网站不作为根站点运行时,我遇到了相同的问题。下面的解决方法对我有效。不要使用/signalr,而是使用../signalr。这将适用于任何网站名称文件夹。没有硬编码的名称'MyApp'。

var connection = $.hubConnection('../signalr', {useDefaultPath: false});

3

我有同样的问题。网站运行作为根目录站点的虚拟目录。由于某种原因,使用 ../signalr 的前缀无法工作,但是使用 ./signalr 可以。

我的示例代码:

function initSR() {
    // logs signalr messages
    $.connection.hub.logging = true;

    // Declare a proxy to reference the hub.             
    var chat = $.connection.myHub;
    $.connection.hub.url = "./signalr";
    $.connection.hub.start();
    // Create a function that the hub can call to broadcast messages.
    chat.client.broadcastMessage = function (message) {
        // Process Message, take action upon receipt
        alert(message);
    };
}

2

我曾经遇到过同样的问题。我的错误在于我调用了错误的端点URL,就像我在配置服务中映射信号URL一样:/notification,但是调用的是[API-Host]/api/notification。将URL中的api删除并调用[API-Host]/notification,这个问题就被解决了。


这也是我的问题。谢谢! - Konstantin

2

我有同样的问题,这与 CORS 有关,你需要在 Startup.cs 的 CORS 配置中添加主机 URL,像这样:

            services.AddCors(option =>
        {
            option.AddPolicy("AutomationCors", builder =>
            {
                builder.AllowAnyMethod()
                    .AllowAnyHeader()
                    .WithOrigins("YOUR LOCALHOST URL",
                                 "YOUR HOST URL")
                    .AllowCredentials();
            });
        });

主机网址应该有www和/或https吗?它支持通配符吗? - Macindows
@Macindows不支持使用allowcredentials选项的通配符。 - Manu Mohan

0

@styfle请指导我正确的方向,问题可以通过注入BASE_URL(至少在Angular 4中)以更灵活的方式解决。

import { Injectable, Inject } from '@angular/core';
import { HubConnection } from '@microsoft/signalr';
import * as signalR from '@microsoft/signalr';
import { Subject, Observable } from 'rxjs';

@Injectable()
export class SignalRService {
    private hubConnection: HubConnection;
    private message: Subject<any>;

    constructor(@Inject('BASE_URL') private baseUrl: string) {
    }

    public connect() {
        this.message = new Subject<any>();
        this.hubConnection = new signalR.HubConnectionBuilder()
            .withUrl(this.baseUrl+"notification-hub")
            .withAutomaticReconnect()
            .build();
        // ...
    }
}

FYI:Angular 9与SignalR客户端1.4.1神奇地找到了baseURL。 - JWP

0

我不需要它在根目录上,我需要它在我的私人网站上。 - user1594757
SignalR能够与服务器的主站点共存于同一端口吗?例如端口80。 - JWP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接