Я столкнулся с более тонкой проблемой и исправил ее, добавив
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
на стороне клиента, как упоминалось @Caims. Но я не думаю, что это правильное решение, и чувствую себя скорее как хак ».
Что вам нужно сделать, это добавить AllowCredentials
на стороне сервера. В любом случае, когда он прибывает в Azure, вы не можете передать это исправление. Поэтому нет необходимости включать WSS только на стороне клиента.
Вот мой ConfigureServices метод:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("CorsPolicy", builder => {
builder
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.WithOrigins("http://localhost:4200");
}));
services.AddSignalR();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
Это мой Настройка Метод:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
{
routes.MapHub<NotifyHub>("/notify");
});
app.UseMvc();
}
И, наконец, вот как я подключился со стороны клиента:
const connection = new signalR.HubConnectionBuilder()
.configureLogging(signalR.LogLevel.Debug)
.withUrl("http://localhost:5000/notify", {
//skipNegotiation: true,
//transport: signalR.HttpTransportType.WebSockets
}).build();
connection.start().then(function () {
console.log('Connected!');
}).catch(function (err) {
return console.error(err.toString());
});
connection.on("BroadcastMessage", (type: string, payload: string) => {
this.msgs.push({ severity: type, summary: payload });
});