我正在使用SignalR 2.0。在我的VS 2012本地运行时,一切正常。但是当我在IIS上发布网站时,它会中断。该站点加载但其中一个脚本返回404 Not Found。脚本就像是。
这条路径确实不存在。正确的路径应该是:
https://example.com的 /私有 / signalr /谈判?XXX
请注意粗体部分。
在网站(https://example.com/)内,我有另一个应用程序(https://example.com/private/)。这个是使用SignalR。
这似乎是SignalR中的一个错误,因为信号器/集线器路径可以从我的私人网站访问。
答案 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();