事实上,此路径不存在。正确的路径应该是:
请注意粗体部分。https://example.com /private / signalr / negotiate?xxx
在WebSite( https://example.com/ )内,我有另一个应用程序( https://example.com/private/ )。 这个应用程序正在使用SignalR。
由于signalr/hubs路径可以从我的私人站点访问,所以这似乎是SignalR的一个错误。
事实上,此路径不存在。正确的路径应该是:
请注意粗体部分。https://example.com /private / signalr / negotiate?xxx
我遇到了类似的问题。 这里是配置/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。
\
的hub URL,而我复制了这些示例。但这意味着signalr
路由来自于默认的Web站点而不是应用程序。去掉前面的\
就解决了这个问题。endpoints.MapHub<MyHub>("myHub");
像JavaScript中的“and”和“hub”连接一样:
var connection = new signalR.HubConnectionBuilder().withUrl("myHub").build();
当使用signalr的网站不作为根站点运行时,我遇到了相同的问题。下面的解决方法对我有效。不要使用/signalr
,而是使用../signalr
。这将适用于任何网站名称文件夹。没有硬编码的名称'MyApp'。
var connection = $.hubConnection('../signalr', {useDefaultPath: false});
我有同样的问题。网站运行作为根目录站点的虚拟目录。由于某种原因,使用 ../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);
};
}
我曾经遇到过同样的问题。我的错误在于我调用了错误的端点URL,就像我在配置服务中映射信号URL一样:/notification
,但是调用的是[API-Host]/api/notification
。将URL中的api
删除并调用[API-Host]/notification
,这个问题就被解决了。
我有同样的问题,这与 CORS
有关,你需要在 Startup.cs 的 CORS
配置中添加主机 URL,像这样:
services.AddCors(option =>
{
option.AddPolicy("AutomationCors", builder =>
{
builder.AllowAnyMethod()
.AllowAnyHeader()
.WithOrigins("YOUR LOCALHOST URL",
"YOUR HOST URL")
.AllowCredentials();
});
});
@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();
// ...
}
}
可能您在应用程序中添加了MapSignalR()(https://example.com/private/)。 如果您想将其放在根目录下,则需要在您的网站(https://example.com/)上进行配置。