【发布时间】:2016-12-25 01:47:12
【问题描述】:
我正在尝试在我的 Web API 上构建一个通知服务来通知 JavaScript (Aurelia) 客户端 (WebApp)。我的 Web API 和 WebApp 位于不同的域中。
我有一个简单的NotificationHub:
public class NotificationHub:Hub
{
public void NotifyChange(string[] values)
{
Clients.All.broadcastChange(values);
}
}
我在 Web API 的Startup 中配置 SignalR 如下:
public void Configuration(IAppBuilder app)
{
HttpConfiguration httpConfig = new HttpConfiguration();
var cors = new EnableCorsAttribute("http://localhost:9000", "*", "*");
httpConfig.EnableCors(cors);
app.MapSignalR();
WebApiConfig.Register(httpConfig);
...
}
在我的 WebApp 中,我尝试从我的 Web API 访问 signalr/hubs,如下所示:
Promise.all([...
System.import('jquery'),
System.import('signalr'), ...
])
.then((imports) => {
return System.import("https://localhost:44304/signalr/hubs");
});
我还在我的config.js 中添加了meta 部分:
System.config({
...
meta: {
"https://*/signalr/hubs": { //here I also tried with full url
"format": "global",
"defaultExtension": false,
"defaultJSExtension": false,
"deps": ["signalr"]
}
}
});
尽管有这些配置,我仍然有以下问题:
- 来自 WebApp 的对
signalr/hubs的请求以https://localhost:44304/signalr/hubs.js的形式发出,并返回HTTP 404。请注意,浏览https://localhost:44304/signalr/hubs会返回hubs脚本。 - 在
$.connection("https://localhost:44304/signalr").start()上,我收到以下错误:
XMLHttpRequest 无法加载 https://localhost:44304/signalr/negotiate?clientProtocol=1.5&_=1471505254387。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://localhost:9000' 因此不允许访问。
请让我知道我在这里缺少什么?
更新: 使用适当的 CORS 配置和@kabaehr 建议的gist,我现在可以连接到 SignalR 集线器。但是,广播(推送通知)仍然不起作用。
我的 SignalR 配置:
public static class SignalRConfig
{
public static void Register(IAppBuilder app, EnableCorsAttribute cors)
{
app.Map("/signalr", map =>
{
var corsOption = new CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context =>
{
var policy = new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, SupportsCredentials = true };
// Only allow CORS requests from the trusted domains.
cors.Origins.ForEach(o => policy.Origins.Add(o));
return Task.FromResult(policy);
}
}
};
map.UseCors(corsOption).RunSignalR();
});
}
}
我在Startup使用如下:
var cors = new EnableCorsAttribute("http://localhost:9000", "*", "*");
httpConfig.EnableCors(cors);
SignalRConfig.Register(app, cors);
WebApiConfig.Register(httpConfig);
我正在尝试按如下方式推送通知:
GlobalHost.ConnectionManager.GetHubContext<NotificationHub>().Clients.All.broadcastChange(new[] { value });
但是,我的客户没有收到broadcastChange 的通知。我假设在使用gist 时不必显式导入https://localhost:44304/signalr/hubs。
【问题讨论】:
-
你的来源好像没有使用
https?首先尝试"*"来解决这个问题。 -
@MarkC。感谢您的评论。我试过
"*",但是,我不能说它是否有效,因为SystemJS在signalr/hubs的末尾附加了.js,我得到了一个404。我认为这需要以某种方式处理,但我不确定如何处理。 -
有几个系统 js 插件可以防止像github.com/systemjs/plugin-text 这样附加“.js”,但我不知道这是否是问题。
-
@kabaehr 有点晚了 :) 但正如告知的那样,我已经发布了答案。想看的可以去看看。
标签: javascript c# asp.net-web-api signalr systemjs