JavaScript(Aurelia)クライアント(WebApp)に通知する通知APIをWeb API上に構築しようとしています。 My Web APIとWebAppは異なるドメインにあります。SignalR、Web API、およびSystemJSを連携させることができません
私はシンプルNotificationHub
を持っている:
public class NotificationHub:Hub
{
public void NotifyChange(string[] values)
{
Clients.All.broadcastChange(values);
}
}
次のように私は、Web APIのStartup
でSignalRを設定しています:私のWebAppので
public void Configuration(IAppBuilder app)
{
HttpConfiguration httpConfig = new HttpConfiguration();
var cors = new EnableCorsAttribute("http://localhost:9000", "*", "*");
httpConfig.EnableCors(cors);
app.MapSignalR();
WebApiConfig.Register(httpConfig);
...
}
、私は私のWebサイトからsignalr/hubs
にアクセスしようとしていますAPIは次のとおりです。
Promise.all([...
System.import('jquery'),
System.import('signalr'), ...
])
.then((imports) => {
return System.import("https://localhost:44304/signalr/hubs");
});
I hav
System.config({
...
meta: {
"https://*/signalr/hubs": { //here I also tried with full url
"format": "global",
"defaultExtension": false,
"defaultJSExtension": false,
"deps": ["signalr"]
}
}
});
これらの構成にもかかわらず、私はまだ持っている以下のような問題点:eはまた私のconfig.js
でmeta
セクションを追加し
- 要求を
signalr/hubs
ため、WebAppのから、https://localhost:44304/signalr/hubs.js
として作られた、とHTTP 404
されます返されます。https://localhost:44304/signalr/hubs
を参照すると、hubs
スクリプトが返されます。$.connection("https://localhost:44304/signalr").start()
で - 、私は次のエラーが発生します:
XMLHttpRequest cannot load https://localhost:44304/signalr/negotiate?clientProtocol=1.5&_=1471505254387 . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:9000 ' is therefore not allowed access.
私は私がここで行方不明です何を教えてください?
更新:適切な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'が '' signal_/hubs'の最後に '.js'を追加するので、実際に動作しているかどうかはわかりません。 404 '。私は何とか先に処理する必要があると思いますが、どうしたらよいか分かりません。 –
システムのjsには、https://github.com/systemjs/plugin-textのような「.js」の追加を防ぐことができるプラグインがいくつかありますが、これが問題であるかどうかはわかりません。 – kabaehr