我正在尝试托管一个远程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集线器。在开发人员工具中,我得到的状态为“(失败)net :: ERR_FAILED”,没有任何其他信息。
上面的示例使用SSL(https)。同样,在http模式下运行两个解决方案时,我也会遇到相同的问题。
像这样设置您的CORS:
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder
.WithOrigins("https://localhost:44339/")
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetIsOriginAllowed((host) => true);
}));
注意顺序!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句