SignalR谈判404

时间:2013-11-11 16:15:12

标签: asp.net iis-7.5 signalr

我正在使用SignalR 2.0。在我的VS 2012本地运行时,一切正常。但是当我在IIS上发布网站时,它会中断。该站点加载但其中一个脚本返回404 Not Found。脚本就像是。

  

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

这条路径确实不存在。正确的路径应该是:

  

https://example.com /私有 / signalr /谈判?XXX

请注意粗体部分。

在网站(https://example.com/)内,我有另一个应用程序(https://example.com/private/)。这个是使用SignalR。

这似乎是SignalR中的一个错误,因为信号器/集线器路径可以从我的私人网站访问。

8 个答案:

答案 0 :(得分:17)

我有类似的问题。 以下是配置/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。

答案 1 :(得分:3)

我遇到了同样的问题,这全都与CORS有关,您应该像这样在Startup.cs的CORS配置中添加主机URL:

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

答案 2 :(得分:1)

当带有信号器的网站未以根网站运行时,我遇到了同样的问题。以下解决方案适合我。而不是使用/signalr,请使用../signalr。它适用于任何站点名称文件夹。没有硬编码的名称' MyApp' var connection = $.hubConnection('../signalr', {useDefaultPath: false});

答案 3 :(得分:1)

有同样的问题。作为根站点的虚拟目录运行的网站。出于某种原因,在../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);
    };
}

答案 4 :(得分:1)

我遇到了同样的问题。我这样做的错误是我调用了错误的端点URL,就像我在配置服务(如/notification中映射Signal Url但调用了[API-Host]/api/notification一样。从网址中删除api,并致电为我修复的[API-Host]/notification

答案 5 :(得分:0)

您可能在应用程序中添加了MapSignalR()(https://example.com/private/)。 如果您希望它在根目录上,请在您的网站上进行配置(https://example.com/

答案 6 :(得分:0)

@styfle指示我正确的方向,可以通过更灵活的方式注入BASE_URL(至少在角度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();
        // ...
    }
}

答案 7 :(得分:0)

我在IIS默认网站上运行的应用程序遇到了同样的问题。
Microsoft的所有示例都显示了以开头\开头的中心URL,而我已复制了这些示例。但这意味着signalr路由来自默认网站而不是应用程序。删除开头的\可以解决。

所以我在Startup.cs中使用了端点,例如:

endpoints.MapHub<MyHub>("myHub");

和Javascript中的集线器连接,例如:

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