AspNetCore.SignalR 2.1 和 CORS
AspNetCore.SignalR 2.1 and CORS
我正在将我们的 SignalR-Service 迁移到新的 AspNetCore.SignalR(2.1 预览版),现在我遇到了 CORS 问题。我永远不会从同一个来源访问该服务,所以我通常需要禁用 CORS。
我有以下 CORS 策略
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
(来自不同来源的我的 WebApi-Controller 调用在这些策略下工作正常)
使用 SignalR for AspNetCore 的旧预览包 (AspNetCore.SignalR.Server) 我没有遇到任何问题,但现在,我的测试客户端得到了一些 http-405,这似乎是 CORS 的问题。
SignalR 是否有额外的 CORS 配置,或者我是否需要允许其他配置?
编辑:
我创建了一个 fresh/clean 示例项目,没有任何特殊的中间件来检查这里是否发生了错误。
Web 应用程序示例 | startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
services.AddMvc();
services.AddSignalR(options =>
{
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowCors");
app.UseMvc();
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
}
}
}
示例 Winforms 应用程序
private HubConnection _hubConnection;
private void button1_Click(object sender, EventArgs e)
{
var connection = new HubConnectionBuilder().WithUrl("http://localhost:63771/test")
.WithConsoleLogger()
.WithTransport(Microsoft.AspNetCore.Sockets.TransportType.WebSockets)
.Build();
connection.StartAsync();
}
示例 Winforms 应用程序控制台输出
fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[8]
01/10/2018 15:25:45: Failed to start connection. Error getting negotiation response from 'http://localhost:63771/test'.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).
bei System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
bei Microsoft.AspNetCore.Sockets.Client.HttpConnection.<Negotiate>d__42.MoveNext()
我有同样的问题,我在客户端使用 reactjs。
将版本从使用 "@aspnet/signalr-client"
更改为 "@aspnet/signalr"
解决了我的问题
尝试像这样将 app.UseSignalR()
移动到 app.UseMvc()
之上
app.UseCors("AllowCors");
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
app.UseMvc();
升级到预览版 1 时,您必须将软件包升级到 @aspnet/signalr
:
NOTE: Previous previews of the SignalR client library for JavaScript
were named @aspnet/signalr-client. This has been deprecated as of
Preview 1.
我解决了问题。
client-package 和 server-package 不在确切的颠覆状态。
它是 2.1-preview3210 和 2.1-preview3209(示例编号)。
server-package 经常发布到 nuget 提要,但 client-package (npm) 不会。所以我自己克隆了最新的 git repo 并构建了库并且它可以工作。
您将不再有问题,client-package 现在是 up-to-date。
这对我不起作用,但略有不同的版本却起作用了 -
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseCors(builder => builder
.AllowAnyHeader()
.AllowAnyMethod()
.SetIsOriginAllowed((host) => true)
.AllowCredentials()
);
app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); });
app.UseMvc();
}
如果您要将项目迁移到 asp.net 核心版本 3.x,您可以从 Configure
方法升级 routing,如下所示:
app.UseCors("AllowCors");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapHub<TestHub>("/test");
});
app.UseMvc
和 app.UseSignalR
将替换为 app.UseEndpoints
。 app.UseSignalR
也不能再使用了,因为:
This method is obsolete and will be removed in a future version.
我正在将我们的 SignalR-Service 迁移到新的 AspNetCore.SignalR(2.1 预览版),现在我遇到了 CORS 问题。我永远不会从同一个来源访问该服务,所以我通常需要禁用 CORS。
我有以下 CORS 策略
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
(来自不同来源的我的 WebApi-Controller 调用在这些策略下工作正常)
使用 SignalR for AspNetCore 的旧预览包 (AspNetCore.SignalR.Server) 我没有遇到任何问题,但现在,我的测试客户端得到了一些 http-405,这似乎是 CORS 的问题。
SignalR 是否有额外的 CORS 配置,或者我是否需要允许其他配置?
编辑: 我创建了一个 fresh/clean 示例项目,没有任何特殊的中间件来检查这里是否发生了错误。
Web 应用程序示例 | startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using WebApplication1.HUBs;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(
options => options.AddPolicy("AllowCors",
builder =>
{
builder
.AllowAnyOrigin()
.AllowCredentials()
.AllowAnyHeader()
.AllowAnyMethod();
})
);
services.AddMvc();
services.AddSignalR(options =>
{
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowCors");
app.UseMvc();
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
}
}
}
示例 Winforms 应用程序
private HubConnection _hubConnection;
private void button1_Click(object sender, EventArgs e)
{
var connection = new HubConnectionBuilder().WithUrl("http://localhost:63771/test")
.WithConsoleLogger()
.WithTransport(Microsoft.AspNetCore.Sockets.TransportType.WebSockets)
.Build();
connection.StartAsync();
}
示例 Winforms 应用程序控制台输出
fail: Microsoft.AspNetCore.Sockets.Client.HttpConnection[8]
01/10/2018 15:25:45: Failed to start connection. Error getting negotiation response from 'http://localhost:63771/test'.
System.Net.Http.HttpRequestException: Response status code does not indicate success: 405 (Method Not Allowed).
bei System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
bei Microsoft.AspNetCore.Sockets.Client.HttpConnection.<Negotiate>d__42.MoveNext()
我有同样的问题,我在客户端使用 reactjs。
将版本从使用 "@aspnet/signalr-client"
更改为 "@aspnet/signalr"
解决了我的问题
尝试像这样将 app.UseSignalR()
移动到 app.UseMvc()
之上
app.UseCors("AllowCors");
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
app.UseMvc();
升级到预览版 1 时,您必须将软件包升级到 @aspnet/signalr
:
NOTE: Previous previews of the SignalR client library for JavaScript were named @aspnet/signalr-client. This has been deprecated as of Preview 1.
我解决了问题。
client-package 和 server-package 不在确切的颠覆状态。 它是 2.1-preview3210 和 2.1-preview3209(示例编号)。
server-package 经常发布到 nuget 提要,但 client-package (npm) 不会。所以我自己克隆了最新的 git repo 并构建了库并且它可以工作。
您将不再有问题,client-package 现在是 up-to-date。
这对我不起作用,但略有不同的版本却起作用了 -
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseCors(builder => builder
.AllowAnyHeader()
.AllowAnyMethod()
.SetIsOriginAllowed((host) => true)
.AllowCredentials()
);
app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); });
app.UseMvc();
}
如果您要将项目迁移到 asp.net 核心版本 3.x,您可以从 Configure
方法升级 routing,如下所示:
app.UseCors("AllowCors");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapHub<TestHub>("/test");
});
app.UseMvc
和 app.UseSignalR
将替换为 app.UseEndpoints
。 app.UseSignalR
也不能再使用了,因为:
This method is obsolete and will be removed in a future version.