Я пытаюсь использовать SignalR из клиента Javascript для основного приложения ASP.NET с помощью пакета nuget Microsoft.AspNetCore.SignalR.1.1.0
Первый
services.AddSignalR(c => c.EnableDetailedErrors = true);
Тогда я настроил CORS, как показано ниже. Мы используем HttpSys
. У меня есть подозрение, что проблема async
здесь, поскольку это может означать, что CORS не был установлен до UseSignalR
, поэтому я попытался использовать именованную политику, и это сработало.
app.Use (async (context, next) => {
var url = GetOriginUrl (context.Request);
context.Response.Headers.Add ("Access-Control-Allow-Origin", url);
context.Response.Headers.Add ("Access-Control-Allow-Credentials", "true");
if (context.Request.Method == "OPTIONS") {
context.Response.Headers.Add ("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
context.Response.Headers.Add ("Access-Control-Allow-Headers", "Content-Type, Accept, User, x-requested-with");
}
#if RUN_ON_WINDOWS`
if (context.Request.Method != "OPTIONS" && !context.Request.HttpContext.User.Identity.IsAuthenticated) {
context.Response.StatusCode = 401;
return; //Stop pipeline and return immediately.
}
#endif`
await next ();
});
Сразу после ...
app.UseStaticFiles ()
.UseSignalR (routes => {
routes.MapHub<LiveMarginSource> ("/api/liveMarginHub");
})
.UseStatusCodePages ()
.UseMvc ()
.UseSwagger ()
.UseSwaggerUI (c => { c.SwaggerEndpoint ("/swagger/v1/swagger.json", "Collateral Management API"); });
А в клиенте ... с @aspnet/signalr@^1.1.4
connectLiveMargin = () => {
const liveMarginHub = new SignalR.HubConnectionBuilder()
.withUrl('http://localhost:5000/api/liveMarginHub')
.configureLogging(SignalR.LogLevel.Debug)
.build();
liveMarginHub.on('ReceiveMessage', data => {
console.log(data);
// find the data row and update
});
liveMarginHub.start()
.catch(err => console.log(err));
}
Но я не могу подключиться
SignalR
само по себе работает, когда я запускаю браузер Chrome таким образом "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="C:/Chrome dev session" --disable-web-security
РЕШЕНИЕ (по крайней мере, работает, когда клиент и сервер находятся на моей локальной машине)
Затем я попробовал следующий способ, как некоторые опубликовали, хотя я не люблю указывать источник таким образом или в качестве настройки приложения. Чтобы проверить, как это будет вести себя при развертывании на сервере или при запуске в контейнере Kubernetes в Linux
services.AddCors(options => {
options.AddPolicy("SignalRPolicy",
builder => {
builder.WithOrigins(new string[] { "http://localhost:3000" })
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
После ...
app.UseCors("SignalRPolicy")
.UseStaticFiles()
.UseStatusCodePages()
.UseMvc()
.UseSignalR(routes => {
routes.MapHub<LiveMarginSource>("/api/liveMarginHub");
})
.UseSwagger()
.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Collateral Management API"); });