【发布时间】:2020-08-24 00:27:33
【问题描述】:
我正在尝试托管远程 SignalR 集线器。我创建了一个 .NET core 3.1 web api 应用程序,我的 Startup 类中有以下代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder
.AllowAnyMethod()
.AllowAnyHeader()
.AllowAnyOrigin();
}));
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseStaticFiles();
app.UseCors("CorsPolicy");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<KappHub>("/myHub");
});
}
应该启用 CORS 以接受每个来源。在这个项目中,我创建了一个静态 index.html 文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h1>Kapp Folc Local Tester</h1>
<script src="js/signalr/dist/browser/signalr.js"></script>
<script>
var connection = new signalR.HubConnectionBuilder().withUrl("/myHub").build();
connection.start().then(function () {
console.log('OK');
}).catch(function (err) {
console.log(err);
});
</script>
</body>
</html>
这很好用!当我深入研究开发人员工具时,我可以看到我的网页发布到 https://localhost:5001/myHub/negotiate?negotiateVersion=1 并且我收到了 200 回复。 SignalR 在这里工作得很好!
当我使用邮递员或任何其他 REST 客户端发布到 https://localhost:5001/myHub/negotiate?negotiateVersion=1 时,它工作正常并且我得到了响应。
现在我创建了第二个 .NET 核心 Web api 项目,该项目也包含一个静态 index.html 文件以及 signalr.js 脚本。然而,这个项目没有托管 SignalRhub,但我正在尝试从我的第一个项目连接到 signalR 集线器。 index.html 是我的第一个项目中的 html 的精确副本,但带有到我的第一个项目中的 signalR 集线器的连接字符串。它看起来像这样:
var connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:5101/myHub").build();
我的第二个项目中的启动是这样的:
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseStaticFiles();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
当我运行这个项目并从我的第二个项目导航到 index.html 时,它无法从我的第一个项目连接到 signalR 集线器。在开发者工具中,我得到一个“(failed)net::ERR_FAILED”状态,没有任何其他信息。
以上示例使用 SSL (https)。同样在 http 模式下运行这两种解决方案时,我遇到了同样的问题。
【问题讨论】:
-
阅读docs.microsoft.com/aspnet/core/signalr/… 中的 SignalR 和 CORS 具体来说,您缺少 AllowCredentials() 部分,并且 AllowAnyOrigin 将无法与 AllowCredentials 一起使用。
标签: .net-core signalr-hub signalr.client asp.net-core-signalr